TrueCharts Bot 645e4dc12a feat(dispatcharr): update image docker.io/dispatcharr/dispatcharr 0.25.1 → 0.26.0 (#48862)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
|
[docker.io/dispatcharr/dispatcharr](https://redirect.github.com/Dispatcharr/Dispatcharr)
| minor | `2bdcfd9` → `9275b0c` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/18710) for more information.

Add the preset `:preserveSemverRanges` to your config if you don't want
to pin your dependencies.

---

### Release Notes

<details>
<summary>Dispatcharr/Dispatcharr
(docker.io/dispatcharr/dispatcharr)</summary>

###
[`v0.26.0`](https://redirect.github.com/Dispatcharr/Dispatcharr/blob/HEAD/CHANGELOG.md#0260---2026-06-07)

[Compare
Source](https://redirect.github.com/Dispatcharr/Dispatcharr/compare/v0.25.1...v0.26.0)

##### Added

- **EPG logo auto-apply for XMLTV and Schedules Direct.** Channel logos
are applied from `EPGData.icon_url` through a shared helper used by bulk
"Set Logos from EPG", optional per-source auto-apply on refresh
(`auto_apply_epg_logos` in source `custom_properties`), and a new
`epg_source_id` option on the set-logos-from-epg API. Large libraries
are processed in 500-channel chunks without loading every mapped row
into memory.
- **Schedules Direct EPG integration.** Dispatcharr now supports
Schedules Direct as a first-class EPG source type alongside XMLTV and
dummy EPG, with credential auth, lineup management, and guide refresh
through the existing EPG pipeline and WebSocket progress. (Closes
[#&#8203;1246](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1246))
— Thanks [@&#8203;Shokkstokk](https://redirect.github.com/Shokkstokk)
- Lineup manager in EPG source settings: search by postal code,
add/remove up to four active lineups, with SD's six-adds-per-24-hours
limit and midnight-UTC reset surfaced in the UI.
- MD5 delta refresh skips unchanged schedule and program downloads; a
two-hour minimum interval between full refreshes is enforced (bypassable
via force refresh).
- Station logos in dark, light, gray, or white variants (`logo_style`),
stored in `EPGData.icon_url` alongside XMLTV channel icons.
- Optional program poster fetch (off by default): configurable style
preference (SD Recommended via Gracenote's `primary` flag, or
portrait/landscape banner/iconic variants with fallbacks), served
through a backend proxy cached by nginx on first view.
- XMLTV-compatible cast output (`role` for character names, `guest` for
guest stars).
- Lightweight stations-only fetch on source creation so EPG entries
exist for auto-matching before the first full schedule pull.
- **Live EPG program preview in the channel create/edit modal.** When
selecting an EPG channel in the channel form, a "Current Program" card
appears showing the currently-airing program title, description, and a
progress bar. The backend builds a byte-offset index over the raw XMLTV
file after each EPG refresh so lookups seek directly to the relevant
file positions rather than parsing the full file - returning results in
1-10ms regardless of source size. If the index has not yet been built
for a source, the API dispatches an async background build and the
frontend retries up to 20 times over a 3-minute window. The
`ProgramPreview` component was extracted into a shared component reused
by the Stats page. The `programme_index` field on `EPGSource` is
excluded from all API list responses to avoid returning multi-MB blobs.
— Thanks
[@&#8203;FiveBoroughs](https://redirect.github.com/FiveBoroughs)
- **Public IP display in the sidebar is now blurred by default and
reveals on click.** Prevents accidental exposure in screenshots and
screen shares. A new toggle in Settings > System Settings lets users
disable IP and geolocation fetching entirely. A
`DISPATCHARR_ENABLE_IP_LOOKUP` environment variable provides a
container-level override; when set to `false` the toggle is hidden from
the UI and cannot be changed. (Closes
[#&#8203;1302](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1302))
— Thanks [@&#8203;sethwv](https://redirect.github.com/sethwv)
- **Configurable per-page count and sticky pagination footer in Plugin
Browse.** The pagination controls now live in a fixed footer bar at the
bottom of the page. A page-size selector (9 / 18 / 27 / 36) sits
alongside the pagination widget and an item range readout (`X to Y of
Z`). The selected page size is persisted in `localStorage` so it
survives page navigations. — Thanks
[@&#8203;sethwv](https://redirect.github.com/sethwv)
- **VOD basic sync now stores additional metadata from the provider's
stream list.** When a provider includes `director`, `cast`,
`release_date`, or `trailer`/`youtube_trailer` in its `get_vod_streams`
response, Dispatcharr now captures and stores those fields in
`custom_properties` during the initial sync pass. Previously, this data
was discarded and only populated if an advanced per-movie refresh was
triggered. - Thanks
[@&#8203;nemesbak](https://redirect.github.com/nemesbak)

##### Changed

- **`send_websocket_update` now detects Celery worker context when
gevent is monkey-patched.** EPG refresh progress (including Schedules
Direct) uses the shared `send_epg_update` helper instead of a duplicate
synchronous Redis sender. In Celery prefork workers that inherit gevent
patching, WebSocket messages are delivered synchronously via the
existing `_gevent_ws_send` Redis path; uWSGI continues to use
`gevent.spawn` as before.
- **Schedules Direct EPG delete confirmation shows username only.** The
delete dialog no longer surfaces password or API key fields for
credential-based SD sources.
- **Channel edit form reorganized into three semantic columns.** Fields
are now grouped as Identity (name, number, group, logo), Guide Data
(TVG-ID, Gracenote StationId, EPG picker, current program preview), and
Behavior/Access (stream profile, user level, mature content, hidden).
The EPG section having its own column gives the `ProgramPreview` card
enough width to truncate long titles correctly rather than expanding the
column.
- **IP lookup result delivered via WebSocket push.** When the background
lookup completes, an `ip_lookup_complete` event is pushed to all
connected clients so the sidebar IP field populates without polling. A
`Skeleton` placeholder is shown while the lookup is in progress.
- **`get_host_and_port` and `build_absolute_uri_with_port` moved from
`apps/output/views.py` to `core/utils.py`.** Both helpers have no
dependencies on anything in `apps/output` and are now used in
`apps/channels/serializers.py` as well. Moving them to `core/utils`
eliminates the need for a local import inside `LogoSerializer` and makes
them available to the rest of the codebase without circular-import risk.
`LogoSerializer.get_cache_url()` was also updated to use
`build_absolute_uri_with_port` instead of
`request.build_absolute_uri()`, so logo cache URLs now correctly include
non-standard ports (fixing port-stripping for logo URLs behind reverse
proxies, matching the existing fix applied to M3U and EPG URLs).
- **nginx logo/poster proxy cache moved to `/data/logo_cache`.**
`proxy_cache_path` now uses the persistent data volume instead of
`/app/logo_cache`, and the init script ensures the directory exists with
correct ownership on container start.
- **`debian_install.sh` switched from Gunicorn to uWSGI with gevent
workers.** The Debian/LXC bare-metal installer now deploys Dispatcharr
under the same uWSGI + gevent stack used by the Docker image,
eliminating a class of compatibility differences between the two
deployment paths. The installer writes a `uwsgi-debian.ini` next to the
app and manages uWSGI via a systemd service. The nginx site config now
uses `uwsgi_pass` + `include uwsgi_params` instead of `proxy_pass`,
which correctly populates `SERVER_PORT` in the WSGI environ so M3U
playlist URLs include the configured port number (fixing the
port-stripping bug from
[#&#8203;1267](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1267)
for bare-metal installs). Python 3.13 is now provisioned through uv's
managed runtime so the install works on Debian 12 and Ubuntu 24.04 LTS
regardless of the system Python version.
- **`get_vod_streams` XC API response was missing metadata fields
available from basic sync.** When a provider includes `director`,
`cast`, `release_date`, `plot`, `genre`, or `year` in its
`get_vod_streams` response, Dispatcharr stores those fields during the
basic sync pass but was not including them in its own `get_vod_streams`
XC output. The endpoint now outputs all six fields. The `trailer` key in
the response also mapped to the wrong internal key (`trailer` instead of
`youtube_trailer`) following the storage key rename, so the trailer
field was always empty until an advanced refresh ran. Both issues are
corrected. Users with existing libraries should trigger a VOD provider
refresh to populate the missing fields. (Fixes
[#&#8203;1228](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1228))
- **Docker base image now uses a multi-stage build.** The builder stage
installs compilers and dev headers (`gcc`, `g++`, `gfortran`,
`build-essential`, `libopenblas-dev`, `libpcre3-dev`, `python3.13-dev`,
`ninja-build`) to create the virtual environment and compile the legacy
NumPy wheel (cpu-baseline=none for old hardware). The final runtime
image starts from the same ffmpeg base, copies only the prebuilt venv
and wheel from the builder, and installs only the runtime libraries
needed at runtime - eliminating compiler binaries from production
containers and reducing final image size. — Thanks
[@&#8203;kensac](https://redirect.github.com/kensac)
- **`libpq-dev` removed from both build and runtime stages.** The
project uses `psycopg[binary]` (psycopg3), which bundles its own
statically linked copy of libpq inside the wheel. No system libpq
headers or shared library are needed at build or runtime.
- **Database driver upgraded from `psycopg2` to `psycopg3`
(`psycopg[binary]`).** psycopg3 rewrote its network I/O layer in Python,
so `gevent`'s `monkey.patch_all()` makes it gevent-cooperative without
any additional patching. The `psycogreen` dependency and its
driver-patching block in `gevent_patch.py` have been removed. Django's
native psycopg3 connection pool is explicitly disabled (`pool: False`)
so `django-db-geventpool` remains in sole control of connection
lifecycle. The `dropdb` management command was updated to the `psycopg`
API (`psycopg.connect`, `psycopg.sql`).
- **Frontend unit tests extended to additional form components and the
Guide page.** `ProgramRecordingModal`, `Recording`,
`RecordingDetailsModal`, `RecurringRuleModal`, `ScheduleInput`,
`SeriesRecordingModal`, `SeriesRuleEditorModal`, `Stream`,
`StreamProfile`, `SuperuserForm`, `User`, `UserAgent`, and
`VODCategoryFilter` now have Vitest + Testing Library test suites.
Business logic was extracted from these components into corresponding
utility modules and is exercised through the new tests. The Guide page
was similarly refactored with extracted utils, and `dateTimeUtils.js`
was extended to support the new test coverage. — Thanks
[@&#8203;nick4810](https://redirect.github.com/nick4810)
- **Official plugin repository manifest URL moved to GitHub Pages.** The
default `OFFICIAL_REPO_URL` now points to
`https://dispatcharr.github.io/Plugins/manifest.json` instead of the raw
GitHub content URL. GitHub Pages avoids opaque caching on raw content
that could serve stale manifests without indication. A data migration
updates existing `PluginRepo` rows marked `is_official=True` in place;
fresh installs pick up the new URL from the model default after the seed
migration runs. — Thanks
[@&#8203;sethwv](https://redirect.github.com/sethwv)

##### Performance

- **M3U and EPG channel logo URLs no longer call
`build_absolute_uri_with_port()` per channel.** The host/port/scheme
base URL and logo path prefix/suffix are computed once per request; each
row appends only the logo ID. M3U proxy stream URLs use the same pattern
for channel UUIDs.
- **`get_vod_streams` and `get_series` XC API response times reduced
significantly for large libraries.** Both endpoints previously loaded
all active relations per title (one row per account that carries the
same movie/series), then discarded duplicates in Python. With large
libraries across multiple active accounts this fetched a multiple of N
rows. Both queries now use a single `DISTINCT ON (movie_id/series_id)`
pass over the relation table ordered by account priority, returning
exactly one row per title. Logo URL construction (`reverse()` +
`build_absolute_uri_with_port()`) is also computed once and reused via
prefix/suffix string concatenation, matching the existing pattern in
`get_live_streams`. The `m3u_account` JOIN in `get_series` was also
removed (it was fetched but never read in the loop). Additionally,
`get_series` previously had no `order_by` on `M3USeriesRelation`, so
output order was non-deterministic (physical storage order). Both
endpoints now sort alphabetically by title. Observed improvements: 18s →
12s for 48k movies; 9.5s → 3.5s for 11k series.
- **Database connections are now managed by a persistent per-worker
pool.** Previously each request opened a fresh TCP connection to
PostgreSQL, paid a full authentication handshake, and closed the
connection at request end. `django-db-geventpool` now maintains a pool
of warm connections per uWSGI worker; requests borrow a connection and
return it when done, eliminating connection-setup overhead on every
request. Pool size is bounded (`MAX_CONNS=8` per worker, `REUSE_CONNS=3`
warm connections kept idle) to stay comfortably within PostgreSQL's
default `max_connections=100` across all uWSGI workers, Celery workers,
and Daphne. — Thanks
[@&#8203;JCBird1012](https://redirect.github.com/JCBird1012)
- **Reduced Redis round-trips on the Stats page channel status
endpoint.** `get_basic_channel_info` was making up to 6 individual
`HGET` calls per connected client plus a redundant `HGET` for
`TOTAL_BYTES` (already present in the preceding `HGETALL` result).
Client metadata is now fetched with a single `HMGET` per client, and
`TOTAL_BYTES` is read from the already-fetched hash. Under load with
many active streams this significantly reduces the time each uWSGI
worker holds the GIL servicing the stats endpoint, reducing the chance
of concurrent requests from other pages timing out with a 503. The same
`HGET`-to-`HMGET` consolidation was applied to `stream_ts` and
`get_user_active_connections`. The Stats page frontend was also fixed to
fire the initial fetch only once on mount (previously two `useEffect`
hooks both triggered an immediate fetch on load). — Thanks
[@&#8203;JCBird1012](https://redirect.github.com/JCBird1012)

##### Security

- **M3U endpoint no longer reflects POST body content in error
responses.** The error message for disallowed POST requests previously
echoed the raw request body back to the caller in a `text/html`
response, which could be used for reflected XSS. The body is no longer
included in the response. - Thanks
[@&#8203;sebastiondev](https://redirect.github.com/sebastiondev)
- Updated frontend npm dependencies to resolve 5 audit vulnerabilities
(2 moderate, 2 high, 1 critical):
- Updated `react-router` and `react-router-dom` 7.13.0 → 7.17.0,
resolving **high** unauthenticated RCE via turbo-stream TYPE\_ERROR
deserialization
([GHSA-49rj-9fvp-4h2h](https://redirect.github.com/advisories/GHSA-49rj-9fvp-4h2h)),
**high** open redirect via protocol-relative `//` paths
([GHSA-2j2x-hqr9-3h42](https://redirect.github.com/advisories/GHSA-2j2x-hqr9-3h42)),
**high** XSS in unstable RSC redirect handling via `javascript:` targets
([GHSA-8646-j5j9-6r62](https://redirect.github.com/advisories/GHSA-8646-j5j9-6r62)),
**high** stored XSS via unescaped `Location` header in prerendered
redirect HTML
([GHSA-f22v-gfqf-p8f3](https://redirect.github.com/advisories/GHSA-f22v-gfqf-p8f3)),
**high** DoS via unbounded path expansion in the `__manifest` endpoint
([GHSA-8x6r-g9mw-2r78](https://redirect.github.com/advisories/GHSA-8x6r-g9mw-2r78)),
and **high** DoS via reflected user input in single-fetch
([GHSA-rxv8-25v2-qmq8](https://redirect.github.com/advisories/GHSA-rxv8-25v2-qmq8))
- Updated `vitest` 3.2.4 → 4.1.8, resolving **critical** arbitrary file
read and execution when the Vitest UI server is listening
([GHSA-5xrq-8626-4rwp](https://redirect.github.com/advisories/GHSA-5xrq-8626-4rwp))
- Updated `brace-expansion` 5.0.5 → 5.0.6, resolving **moderate** DoS
when large numeric ranges defeat the documented `max` limit
([GHSA-jxxr-4gwj-5jf2](https://redirect.github.com/advisories/GHSA-jxxr-4gwj-5jf2))
- Updated `ws` 8.19.0 → 8.21.0, resolving **moderate** uninitialized
memory disclosure
([GHSA-58qx-3vcg-4xpx](https://redirect.github.com/advisories/GHSA-58qx-3vcg-4xpx))

##### Fixed

- **HDHR lineup and discovery URLs now use the shared port-aware URI
builder.** `lineup.json`, `discover.json`, and `device.xml` previously
called Django's `request.build_absolute_uri()`, which drops non-standard
ports behind reverse proxies and on dev installs. They now use
`build_absolute_uri_with_port()` from `core/utils.py`, matching M3U,
EPG, XC, and logo cache URLs.
- **EPG channel list did not refresh after a source finished parsing
channels.** The `epg_refresh` WebSocket handler closed over a stale
`epgs` snapshot from when the socket connected. When a newly created
source was not found in that snapshot, the handler updated progress and
returned early without calling `fetchEPGData()`, so the channel picker
and EPG assignment UI stayed empty until a full page reload. The handler
now reads the current store via `getState()` and still calls
`fetchEPGData()` when `parsing_channels` completes.
- **DVR recordings no longer stop immediately when FFmpeg exits
mid-stream.** If FFmpeg crashes, stalls, or loses the source before the
scheduled end time, `run_recording` now restarts it in-process instead
of going straight to HLS→MKV concat and marking the recording complete.
Each restart reuses the same HLS working directory and continues segment
numbering (`append_list`, `-start_number`) so the final MKV is a single
continuous file. Retries are bounded by a per-outage time window
matching live-proxy client tolerance (`STREAM_TIMEOUT` +
`FAILOVER_GRACE_PERIOD`, default 80s); the window resets whenever new
segments resume, so a long recording can survive multiple separate
outages. Reconnect pacing between attempts follows the same `min(0.25 ×
attempt, 3s)` backoff used by the live-proxy `StreamManager`. Input
demuxing also uses `-err_detect ignore_err` to tolerate minor TS
corruption without aborting the process. If the outage window expires
without recovery, the recording is saved as `interrupted` with
`ffmpeg_outage_window_exhausted` rather than falsely reported as
`completed`. (Closes
[#&#8203;1170](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1170))
- **DVR HLS→MKV concat now tolerates timestamp splices and corrupt
segments.** The finalize step (and startup recovery concat) previously
used a bare `ffmpeg -f concat -c copy`, which could fail on truncated
tail segments or PTS discontinuities from FFmpeg restarts mid-recording.
Concat now uses a shared `_dvr_build_hls_concat_cmd` helper with
`-fflags +genpts+igndts+discardcorrupt`, `-err_detect ignore_err`, and
`-avoid_negative_ts make_zero`; the existing MP4-intermediate fallback
path uses the same tolerant input flags.
- **DVR FFmpeg restart no longer skips HLS segment numbers.** On
restart, `-start_number` was set to the existing segment count while
`append_list` also incremented the internal sequence for each segment
reloaded from `index.m3u8`, so the first post-restart segment could land
at roughly double the expected index (e.g. `seg_00028.ts` after 14
segments). Restarts now pass `-start_number 0` when the playlist already
lists segments and let `append_list` continue numbering; loose `.ts`
files without a playlist still seed from the highest filename index + 1.
- **Null TS keepalive packets during channel initialization caused Emby
(and Jellyfin) to force a deinterlace transcode or fail playback
entirely.** While waiting for a channel to become ready, the generator
sent a null TS packet (PID `0x1FFF`) every 0.5 s to keep the HTTP
connection alive. Emby probes the initial bytes of the response via
ffprobe; receiving a null packet instead of real stream data produced
incorrect codec metadata and triggered a forced transcode. The
null-packet yield has been replaced with a plain `gevent.sleep(0.1)`.
(Fixes
[#&#8203;1280](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1280))
- **VOD proxy stream URLs survive M3U import refresh cycles.** When
`process_movie_batch` / `process_series_batch` create duplicate content
records during a refresh, existing `M3UMovieRelation` /
`M3UEpisodeRelation` rows are repointed at the new records, orphaning
the old UUIDs. External players (Emby, Jellyfin, ChannelsDVR) that
cached `.strm` URLs with the dead UUID would then 404 even though the
same request carried a stable `stream_id` that maps to an active
relation. The proxy now falls back to stream\_id resolution when the
UUID lookup misses, using strictest-match-first logic (account-scoped
relation preferred, then highest-priority account). A
`[STREAMID-FALLBACK]` WARNING log keeps the underlying import churn. —
Thanks [@&#8203;R3XCHRIS](https://redirect.github.com/R3XCHRIS)
- **IP lookup no longer blocks the settings page load.** The
`environment` endpoint previously made up to three sequential HTTP calls
(ipify, ipapi.co, ip-api.com) with 5s timeouts each, blocking the page
for up to 15s if any were unreachable. The lookups now run in a
background thread on first request and results are cached in Redis for 1
hour, so the endpoint returns immediately on every call. — Thanks
[@&#8203;sethwv](https://redirect.github.com/sethwv)
- **Authenticated users were not identified in VOD connection cards and
stream events when streaming via the web player.** The VOD proxy now
accepts a JWT via a `?token=` query parameter so browser `<video>`
elements (which cannot send `Authorization` headers) can authenticate.
The token is read on the initial request, the resolved user ID is stored
in Redis, then retrieved on the actual streaming request after the
session redirect. Previously the redirect discarded auth context and all
JWT-authenticated VOD sessions were tracked as anonymous. (Fixes
[#&#8203;1224](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1224))
- **Deleting the last playlist (or any playlist) crashed the entire
UI.** `removePlaylists()` in the playlists store filtered the
`playlists` array but never removed the corresponding entries from the
`profiles` map. After deletion, components reading `profiles[deletedId]`
received `undefined` and crashed with `undefined is not an object
(evaluating 'P[R].name')`, replacing the entire page with an error
screen. The profiles map is now cleaned up atomically in the same state
update as the playlists array. (Fixes
[#&#8203;1269](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1269))
- Thanks [@&#8203;nemesbak](https://redirect.github.com/nemesbak)
- **Switching providers in the VOD or Series detail modal had no
effect.** The `provider-info` endpoints for movies and series always
fetched data from the highest-priority provider, ignoring the
`relation_id` the frontend sent when the user selected a different
provider from the dropdown. The endpoints now accept an optional
`relation_id` query parameter and fetch from that specific relation. The
VOD modal also now shows the "Loading additional details..." indicator
while the provider switch is in flight, matching the existing behaviour
in the Series modal. (Fixes
[#&#8203;1285](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1285))
- Thanks [@&#8203;nemesbak](https://redirect.github.com/nemesbak)
- **Per-channel stream profile override was ignored during streaming.**
`Channel.get_stream_profile()` read `self.stream_profile` directly,
bypassing any `ChannelOverride.stream_profile` set by the user on
auto-synced channels. The method now resolves through
`effective_stream_profile_obj`, which checks the channel's override
record first and falls back to the channel's own field. Channels without
an override continue to behave identically to before. (Fixes
[#&#8203;1268](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1268))
- Thanks [@&#8203;nemesbak](https://redirect.github.com/nemesbak)
- **Web-player output profile was ignored for live streams started
outside the Channels page.** `getShowVideoUrl` in
`RecordingCardUtils.js` returned a raw proxy URL without calling
`buildLiveStreamUrl`, so the output profile preference stored in
`localStorage` was not applied when launching a stream from the TV
Guide, Program Detail modal, DVR page, Recording Details modal, or
Recording Card. Only the Channels page (StreamsTable) was calling
`buildLiveStreamUrl` correctly. One additional import and one changed
return value fix all affected entry points. (Fixes
[#&#8203;1304](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1304))
- Thanks [@&#8203;nemesbak](https://redirect.github.com/nemesbak)
- **Plugins with available updates were not sorting to the top of the
Plugin Browse list.** The sort weight function previously treated
`update_available` plugins the same as any other installed plugin,
leaving them buried. They now receive the highest sort priority (below
the search/filter results header) so users can spot pending updates
immediately. — Thanks
[@&#8203;sethwv](https://redirect.github.com/sethwv)
- **Disabled state on the size-labeled install button rendered with a
warm tint instead of appearing clearly disabled.** The CSS filter was
`brightness(0.65) saturate(0.7)`, which left a faint color cast. It is
now `grayscale(1) brightness(0.55)`, matching the standard disabled
appearance. — Thanks
[@&#8203;sethwv](https://redirect.github.com/sethwv)
- **Restoring a backup from an older version left the database with
missing schema.** The restore task ran `pg_restore` which replaced the
entire database (including the `django_migrations` table) but did not
run migrations afterward. If the backup predated a schema migration, the
restored database was missing tables and columns added by those
migrations, causing 500 errors on every API call. `migrate --noinput`
now runs automatically after every restore. The success notification
also now recommends a restart to clear stale service state.
- **Cast and actors lists were silently truncated to the first name.**
When a provider returns `cast` or `actors` as a JSON array, the helper
used during both movie and series basic sync and movie advanced refresh
only extracted the first element. All names in the array are now joined
into a comma-separated string. Providers that return cast as a plain
string are unaffected.
- **Channel Group Override interactions in compact numbering and
override display.** Two related bugs surfaced when Channel Group
Override was used with auto-synced channels. First, compact numbering
silently failed: with an override on the source
`ChannelGroupM3UAccount`, sync stores channels under the override target
group's id (not the source group id), so hide/unhide/repack operations
all missed their channels and slot accounting broke silently (hidden
channels kept their numbers, unhides got none, repack saw zero
channels). The compact paths now include an override-aware fallback to
match channels under both source and override-target group ids. Second,
the clear-override reset button disappeared when an override's stored
value coincidentally matched the provider value. The frontend
`isFormFieldOverridden` function was value-based only; it now also
checks for a persisted override row regardless of value, so the reset
button remains available to clear any override. (Fixes
[#&#8203;1263](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1263),
Fixes
[#&#8203;1276](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1276))
— Thanks [@&#8203;CodeBormen](https://redirect.github.com/CodeBormen)
- **Compact numbering repack is now idempotent.** Auto-synced channel
numbers reshuffled within their configured range on every sync, even
when the provider returned no changes. The compact repack queried
channels with no `ORDER BY`, so packing followed PostgreSQL's physical
row order, which drifts after each repack's UPDATEs and autovacuum. The
channel query now uses `.order_by("id")` (creation order tracks provider
stream order for the default "provider" sort), and explicit name /
tvg\_id / updated\_at sorts carry `c.id` as a secondary tiebreaker so
equal values keep a stable relative order instead of churning. (Fixes
[#&#8203;1321](https://redirect.github.com/Dispatcharr/Dispatcharr/issues/1321))
— Thanks [@&#8203;CodeBormen](https://redirect.github.com/CodeBormen)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMzAuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEzMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbImFwcC9kaXNwYXRjaGFyciIsImF1dG9tZXJnZSIsInJlbm92YXRlL2NvbnRhaW5lciIsInR5cGUvbWlub3IiXX0=-->
2026-06-08 02:21:30 +02:00
2026-06-06 13:52:03 +02:00

title
title
TrueCharts

Community Helm Chart Catalog

docs Discord GitHub last commit


TrueCharts is a catalog of highly optimised Helm Charts. Made for the community, by the community!

All our charts are supposed to work together and be easy to setup using any helm-compatible deployment tool, above all, give the average user more than enough options to tune things to their liking.


Getting started using TrueCharts

docs


Support

Please check our FAQ, manual and Issue tracker There is a significant chance your issue has been reported before!

Still something not working as expected? Contact us! and we'll figure it out together!

Development

pre-commit renovate GitHub last commit


Our development process is fully distributed and agile, so every chart-maintainer is free to set their own roadmap and development speed and does not have to comply to a centralised roadmap. This ensures freedom and flexibility for everyone involved and makes sure you, the end user, always has the latest and greatest of every Chart installed.

Getting into creating Charts

For more information check the website: https://truecharts.org

Contact and Support

Discord


To contact the TrueCharts project:




Contributors

All Contributors

Thanks goes to these wonderful people (emoji key):


Kjeld Schouten-Lebbing
Kjeld Schouten-Lebbing

💻 🚇 📖 👀 💵
Justin Clift
Justin Clift

📖
whiskerz007
whiskerz007

💻
Stavros Kois
Stavros Kois

💻 📖 🐛 👀 💵
allen-4
allen-4

💻
Troy Prelog
Troy Prelog

💻 📖 💵
Dan Sheridan
Dan Sheridan

💻
Sebastien Dupont
Sebastien Dupont

📖 💵
Vegetto
Vegetto

👀
Ellie Nieuwdorp
Ellie Nieuwdorp

💻
Nate Walck
Nate Walck

💻
Lloyd
Lloyd

💻 💵
Dave Withnall
Dave Withnall

📖
ksimm1
ksimm1

📖 🐛 💵 🧑‍🏫
Aaron Johnson
Aaron Johnson

📖
Ralph
Ralph

💻
Joachim Baten
Joachim Baten

💻 🐛
Michael Yang
Michael Yang

💻
Ciaran Farley
Ciaran Farley

📖
Heavybullets8
Heavybullets8

📖 💻 🐛 📹 🧑‍🏫 💵
662
662

💻
alex171
alex171

📖
Techno Tim
Techno Tim

📖
Mingyao Liu
Mingyao Liu

💻 🐛
NightShaman
NightShaman

💻 📖 🐛 💵 🧑‍🏫
Andrew Smith
Andrew Smith

📖 ⚠️
Bob Klosinski
Bob Klosinski

💻
Sukarn
Sukarn

💻 📖
sebs
sebs

💻
Dyllan Tinoco
Dyllan Tinoco

💻
StevenMcElligott
StevenMcElligott

💻 💵 📖 🐛 🧑‍🏫
brothergomez
brothergomez

💻 🐛
sagit
sagit

💻 🐛 📹 📖 🧑‍🏫
Nevan Chow
Nevan Chow

💻
Daniel Carlsson
Daniel Carlsson

🐛
Devon Louie
Devon Louie

🐛
Alex-Orsholits
Alex-Orsholits

🐛
Tails32
Tails32

🐛
Menaxerius
Menaxerius

🐛
hidefog
hidefog

🐛
Darren Gibbard
Darren Gibbard

🐛
Barti
Barti

🐛
Sunii
Sunii

🐛
trbmchs
trbmchs

🐛
Light
Light

🐛
Boostflow
Boostflow

🐛
Trigardon
Trigardon

🐛
dbb12345
dbb12345

🐛 💻
karypid
karypid

🐛
Philipp
Philipp

🐛
John
John

🐛 📖
John Parton
John Parton

🐛
Marc
Marc

🐛
fdzaebel
fdzaebel

🐛
kloeckwerx
kloeckwerx

🐛
Bradley Bare
Bradley Bare

🐛
Alexander Thamm
Alexander Thamm

🐛
rexit1982
rexit1982

🐛
iaxx
iaxx

🐛
Xstar97
Xstar97

💻 🐛 🧑‍🏫
ornias
ornias

📹
Josh Asplund
Josh Asplund

💵
midnight33233
midnight33233

💵
kbftech
kbftech

💵
hogenf
hogenf

💵
Hawks
Hawks

💵
Jim Russell
Jim Russell

💵
TheGovnah
TheGovnah

💵
famewolf
famewolf

💵 🐛
Konrad Bujak
Konrad Bujak

📖
190n
190n

💻 📖
Alexej Kubarev
Alexej Kubarev

📖
r-vanooyen
r-vanooyen

📖
shadofall
shadofall

📖 🧑‍🏫
agreppin
agreppin

💻
Stavros Ntentos
Stavros Ntentos

💻 🤔
Vlad-Florin Ilie
Vlad-Florin Ilie

💻
huma2000
huma2000

🐛
hugalafutro
hugalafutro

🐛 💵
yehia Amer
yehia Amer

📖
Tyler Stransky
Tyler Stransky

🐛
juggie
juggie

🐛
Ben Tilford
Ben Tilford

🐛 💻
I-nebukad-I
I-nebukad-I

🐛 💻
Ethan Leisinger
Ethan Leisinger

💻 📖
Cullen Murphy
Cullen Murphy

💻 🐛
Jason Thatcher
Jason Thatcher

💻 🐛 📖
Stefan Schramek
Stefan Schramek

🐛
nokaka
nokaka

🐛
Gal Szkolnik
Gal Szkolnik

🐛
Evgeny Stepanovych
Evgeny Stepanovych

🐛
Waqar Ahmed
Waqar Ahmed

🐛
DrSKiZZ
DrSKiZZ

💵
Jan Puciłowski
Jan Puciłowski

💻 ⚠️
Shaun Coyne
Shaun Coyne

💵
Christoph
Christoph

💵
Brandon Rutledge
Brandon Rutledge

🐛
Michael Bestas
Michael Bestas

🐛
Jurģis Rudaks
Jurģis Rudaks

🐛
brunofatia
brunofatia

💵
TopicsLP
TopicsLP

📖
Michael Schnerring
Michael Schnerring

🐛 💻
Tamas Nagy
Tamas Nagy

🐛
OpenSpeedTest™️
OpenSpeedTest™️

💻
Richard James Acton
Richard James Acton

📖
lps-rocks
lps-rocks

🐛
Faust
Faust

🐛
uranderu
uranderu

🐛
Tom Cassady
Tom Cassady

🐛
Huftierchen
Huftierchen

🐛
ZasX
ZasX

📖 🧑‍🏫 💻
Kevin T.
Kevin T.

🐛
Steven Scott
Steven Scott

📖
Watteel Pascal
Watteel Pascal

💻
JamesOsborn-SE
JamesOsborn-SE

💻 📖
NeoToxic
NeoToxic

🧑‍🏫 🐛
jab416171
jab416171

📖
Anna
Anna

📖
ChaosBlades
ChaosBlades

🐛
Patric Stout
Patric Stout

💻
Ben Kochie
Ben Kochie

💻
Jeff Bachtel
Jeff Bachtel

📖
Ben Woods
Ben Woods

💻
Karl Shea
Karl Shea

🐛
Balakumaran MN
Balakumaran MN

📖
Jesperbelt
Jesperbelt

📖
cccs31
cccs31

🐛
Sam Smucny
Sam Smucny

💻
Keith Cirkel
Keith Cirkel

💻
mgale456
mgale456

💻
Alec Fenichel
Alec Fenichel

💻
John Dorman
John Dorman

💻
Dan
Dan

💻
u4ium
u4ium

📖
ErroneousBosch
ErroneousBosch

🐛
MaverickD650
MaverickD650

💻 🐛
Grogdor
Grogdor

📖
Ryan Gooler
Ryan Gooler

📖
Rob Herley
Rob Herley

📖
Christian Heimlich
Christian Heimlich

📖
l-moon-git
l-moon-git

💻
hughes5
hughes5

📖
sdimovv
sdimovv

💻
AllieQpzm
AllieQpzm

💻
Dominik
Dominik

🐛
renovate[bot]
renovate[bot]

🔧
allcontributors[bot]
allcontributors[bot]

🔧
dependabot[bot]
dependabot[bot]

🔧
TrueCharts Bot
TrueCharts Bot

🔧 🚇 💻
Mend Renovate
Mend Renovate

🔧
Simone
Simone

💻
Jean-François Roy
Jean-François Roy

💻
Whiskey24
Whiskey24

💻
inmanturbo
inmanturbo

📖
Alex
Alex

💻
Brian Semrad
Brian Semrad

💻
Christopher
Christopher

💻 📖
Csaba Engedi
Csaba Engedi

💻
Cyb3rzombie
Cyb3rzombie

💻
Eric Cavalcanti
Eric Cavalcanti

💻
Gavin Chappell
Gavin Chappell

💻 🐛
raynay-r
raynay-r

💻
Jip-Hop
Jip-Hop

📖
Jonas Wrede
Jonas Wrede

💻
SilentNyte
SilentNyte

📖
Stan
Stan

💻
Tiago Gaspar
Tiago Gaspar

💻
gismo2004
gismo2004

💻
jsegaert
jsegaert

📖
Miguel Angel Nubla
Miguel Angel Nubla

💻
xal3xhx
xal3xhx

💻
jeremybox
jeremybox

📖
Cameron Sabuda
Cameron Sabuda

📖
Jeroen Schepens
Jeroen Schepens

🐛
James Wright
James Wright

📖
Malpractis
Malpractis

🐛
CommanderStarhump
CommanderStarhump

🐛
Vianchiel
Vianchiel

🐛
Maximilian Ehlers
Maximilian Ehlers

🐛
nautilus7
nautilus7

🐛 💻
kqmaverick
kqmaverick

🐛
ccalby
ccalby

🐛
kofeyh
kofeyh

🐛
imjustleaving
imjustleaving

🐛
Cristian Torres
Cristian Torres

🐛
schopenhauer
schopenhauer

🐛
Zackptg5
Zackptg5

🐛
Brad Ackerman
Brad Ackerman

🐛
mcspiff313
mcspiff313

🐛
Fletcher Nichol
Fletcher Nichol

💻 🐛
Marco Faggian
Marco Faggian

💻
John P
John P

📖
kryojenik
kryojenik

💻
Malcolm
Malcolm

📖
depasseg
depasseg

📖
j1mbl3s
j1mbl3s

📖
VictorienXP
VictorienXP

💻
yelhouti
yelhouti

💻
Jaroslav Lichtblau
Jaroslav Lichtblau

📖
MaximilianS
MaximilianS

📖
Dion Larson
Dion Larson

💻 📖
Physics-Dude
Physics-Dude

📖
waflint
waflint

💻
Henry Wilkinson
Henry Wilkinson

💻 📖
cedstrom
cedstrom

💻
v3DJG6GL
v3DJG6GL

🐛 💻
polarstack
polarstack

💻
Keyvan
Keyvan

💻
MickaelFontes
MickaelFontes

💻
David CM
David CM

💻
Aamir Azad
Aamir Azad

📖
Jordan Woyak
Jordan Woyak

💻
Simon Hofman
Simon Hofman

💻
notyouraveragegamer
notyouraveragegamer

📖
Varac
Varac

💻
tuxsudo
tuxsudo

💻
TylerRudie
TylerRudie

📖
qnb59bny5x
qnb59bny5x

💻
Filip Bednárik
Filip Bednárik

🐛
Serhii Shcherbinin
Serhii Shcherbinin

💻
Quentin Raynaud
Quentin Raynaud

🐛
Felix Schäfer
Felix Schäfer

📖
Julien Nicolas de Verteuil
Julien Nicolas de Verteuil

💻
Gabriel Donadel Dall'Agnol
Gabriel Donadel Dall'Agnol

📖
Jon S. Stumpf
Jon S. Stumpf

📖
Tanguille
Tanguille

📖
Dennis
Dennis

🐛 📖
TheIceCreamTroll
TheIceCreamTroll

💻
Atanas Pamukchiev
Atanas Pamukchiev

💻
Boemeltrein
Boemeltrein

📖
Yiannis Marangos
Yiannis Marangos

💻
Michael Ruoss
Michael Ruoss

💻
Aron Kahrs
Aron Kahrs

💻
nemesis1982
nemesis1982

📖
Ed P
Ed P

💻
Frédéric Nadeau
Frédéric Nadeau

📖
frapbod
frapbod

💻
Max Bachhuber
Max Bachhuber

💻
zierbeek
zierbeek

💻
Ac1dburn
Ac1dburn

💻
Antoine Saget
Antoine Saget

📖
Ben Bodenmiller
Ben Bodenmiller

🐛
felixfon
felixfon

📖
adtwomey
adtwomey

📖
alfi0812
alfi0812

💻 📖 🐛 👀
Agassi
Agassi

💻
Artur
Artur

💻
Morgan Hunter
Morgan Hunter

💻
Aleksandr Oleinikov
Aleksandr Oleinikov

💻
Jamie
Jamie

💻
David Gries
David Gries

🐛 💻
Phreeman33
Phreeman33

💻 🐛
Jens Wolvers
Jens Wolvers

💻
Bart Willems
Bart Willems

💻
Caidy
Caidy

💻
Mr Khachaturov
Mr Khachaturov

💻
LordCrash101
LordCrash101

📖
elendil95
elendil95

💻
TheDodger
TheDodger

💻
Saad Awan
Saad Awan

💻
Felix von Arx
Felix von Arx

💻
yodatak
yodatak

💻
Marcel Henrich
Marcel Henrich

💻
Florent Viel
Florent Viel

💻
SniperAsh6
SniperAsh6

💻
Alexandre Acebedo
Alexandre Acebedo

💻
Douglas Chimento
Douglas Chimento

💻
Addison McDermid
Addison McDermid

💻
Jaël Gareau
Jaël Gareau

💻
Steve Sampson
Steve Sampson

📖
Albert Romkes
Albert Romkes

💻
Maja Bojarska
Maja Bojarska

💻
astro-stan
astro-stan

💻
Oliver Simons
Oliver Simons

💻
Brioche
Brioche

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

Licence

License


Truecharts, is primarily based on the AGPL-v3 license, this ensures almost everyone can use and modify our charts. Licences can vary on a per-Chart basis. This can easily be seen by the presence of a "LICENSE" file in that folder.

An exception to this, has been made for every document inside folders labeled as docs or doc and their subfolders: those folders are not licensed under AGPL-v3 and are considered "all rights reserved". Said content can be modified and changes submitted per PR, in accordance to the github End User License Agreement.

SPDX-License-Identifier: AGPL-3.0


built-with-resentment contains-technical-debt

S
Description
Fork of trueforge-org/truecharts with some customizations
Readme 890 MiB
luanti-v1.0.0 Latest
2026-07-08 18:51:26 +00:00
Languages
Go Template 97.9%
Shell 2.1%