No description
Find a file
SergeantPanda 17fbf1d4f7 Performance:
- **Channel table performance**:
  - Removed unused Zustand store subscriptions (`channels`, `selectedProfileChannels`, `selectedProfileChannelIds`) and an unused `channelIds` array subscription from `ChannelsTable` to reduce unnecessary re-renders on unrelated store updates. Cleaned up associated dead code and unused imports.
  - Optimized `ChannelTableStreams` (the expanded stream list inside each channel row) to reduce mount cost: moved pure helper functions and static values (`getCoreRowModel`, `defaultColumn`, stat categorization/formatting) outside the component so they're created once; stabilized the TanStack column definitions by removing `data` and `expandedAdvancedStats` from the `useMemo` dependency array (cell renderers receive the row at render time); switched advanced-stats toggle tracking from `useState` to a `useRef` + per-cell local state so toggling one stream's stats doesn't recreate the entire column array and table instance; memoized `dataIds`, `removeStream`, `handleDragEnd`, and `handleWatchStream` with `useMemo`/`useCallback`; extracted `StreamInfoCell` as a `React.memo` component with its own memoized stat categorization.
  - Fixed `getChannelStreams` store selector to return a stable empty-array reference instead of creating a new `[]` on every call for channels without streams, preventing unnecessary re-renders via the `shallow` comparator.
  - Memoized individual rows in `CustomTableBody` so that expanding/collapsing a channel only re-renders the 1-2 affected rows instead of all rows on the page. Callback functions (`renderBodyCell`, `expandedRowRenderer`) are stored in refs so memoized rows always use the latest version without the function references themselves defeating the memo comparator.
Enhancement:
- Decoupled row expansion from row selection in `CustomTable`, expanding a channel row no longer also selects it. Added an `onRowExpansionChange` callback to `useTable` so callers can react to expansion changes independently of selection state.
- Fixed a stale-closure bug in memoized channel row checkboxes, `selectedTableIdsRef` now ensures the checkbox `onChange` handler and `handleShiftSelect` always read the current selection set rather than the stale set captured at render time. Without this, clicking any checkbox after the first would silently deselect previously checked rows.
- Fixed the "Add to Channel" per-row and bulk buttons in the Streams table not activating when a channel row is expanded. `StreamRowActions` now subscribes to the Zustand store directly (bypassing `React.memo`) so button state updates when `expandedChannelId` or `selectedChannelIds` change without any parent row props changing. Added `targetChannelId` (expanded channel takes priority; falls back to a single selected channel) used by both the per-row and bulk add paths.
- Removed dead props `getExpandedRowHeight` and `tableBodyProps` from `CustomTableBody` and their corresponding pass-throughs in `CustomTable`, both were accepted but never consumed.
2026-04-18 22:04:15 -05:00
.github fix: Update Docker Hub image tags to conditionally format based on event type 2026-03-23 20:11:40 -05:00
.idea Initial commit 2025-02-18 11:14:09 -06:00
apps Enhancement: Cache channel names to reduce repeated DB queries in StreamManager and StreamGenerator. This improves performance by avoiding unnecessary database calls during retries and logging events. (Fixes #1138) 2026-04-17 10:55:41 -05:00
core security: proxy streaming endpoints (stream_ts, stream_xc, stream_vod, head_vod, stream_xc_movie, stream_xc_episode) use @permission_classes([AllowAny]) (access is controlled by the per-stream-type network allow-list inside the view body); the UserAgentViewSet, StreamProfileViewSet, CoreSettingsViewSet, and ProxySettingsViewSet gained get_permissions() methods mapping read actions to IsStandardUser and write actions to IsAdmin; and AuthViewSet.logout was updated to return [Authenticated()]. 2026-04-10 10:47:50 -05:00
dispatcharr Enhancement: Enhanced Swagger UI authorization dialog: registered a custom OpenApiAuthenticationExtension for ApiKeyAuthentication so drf-spectacular now generates an ApiKeyAuth (apiKey) entry alongside jwtAuth. Both entries include descriptive text linking to the relevant endpoints (/api/accounts/token/, /api/accounts/api-keys/generate/, /api/accounts/api-keys/revoke/). 2026-04-10 18:29:13 -05:00
docker Merge branch 'dev' of https://github.com/Dispatcharr/Dispatcharr into pr/JCBird1012/1157 2026-04-14 15:57:48 -05:00
docs/images Updated Readme. 2026-02-11 16:27:31 -06:00
frontend Performance: 2026-04-18 22:04:15 -05:00
scripts feat: add TLS connection support for Redis and PostgreSQL (#950) 2026-03-21 17:24:09 -05:00
tests Move test_wait_for_redis.py call 2026-03-10 11:17:41 -05:00
.dockerignore Refactor for uv transition. 2026-01-30 12:12:42 -06:00
.gitattributes Added gitattributes to support multi-platform development without getting noisy diffs. 2025-03-24 09:13:29 -05:00
.gitignore Remove vite deps and add to gitignore. 2026-03-13 16:45:46 -05:00
.python-version feat: migrate to UV 2026-01-23 22:45:37 +01:00
CHANGELOG.md Performance: 2026-04-18 22:04:15 -05:00
CONTRIBUTING.md Enhance contribution guidelines by adding Contributor License Agreement section and updating pull request template 2026-03-12 11:15:44 -05:00
debian_install.sh fix(install): harden debian_install.sh for non-UTF8 environments 2026-03-06 00:49:23 +01:00
fixtures.json Correct profile name casing for FFmpeg, Streamlink, and VLC in fixtures.json 2025-12-23 15:17:50 -06:00
LICENSE license update 2026-03-11 08:29:40 -04:00
manage.py Initial commit 2025-02-18 11:14:09 -06:00
Plugin_repo.md Enhancement: Add additional fields to plugin manifest including maintainers, deprecated status, repo URL, Discord thread, and latest size. 2026-04-17 09:11:14 -04:00
Plugins.md Plugin fixes/updates 2026-02-05 20:05:29 -06:00
pyproject.toml Enhancement: Add python-gnupg to dependencies for plugin store. 2026-04-10 12:24:19 -05:00
README.md docs: Slight reorganization of the readme. Fix link on Open Collective. 2026-03-21 13:06:10 -05:00
version.py Release v0.23.0 2026-04-17 00:24:03 +00:00

🎬 Dispatcharr — Your Ultimate IPTV & Stream Management Companion

Dispatcharr Logo


📖 What is Dispatcharr?

Dispatcharr (pronounced like "dispatcher") is an open-source powerhouse for managing IPTV streams, EPG data, and VOD content with elegance and control.
Born from necessity and built with passion, it started as a personal project by OkinawaBoss and evolved with contributions from legends like dekzter, SergeantPanda and Bucatini.

Think of Dispatcharr as the *arr family's IPTV cousin — simple, smart, and designed for streamers who want reliability and flexibility.


🎯 What Can I Do With Dispatcharr?

Dispatcharr empowers you with complete IPTV control. Here are some real-world scenarios:

💡 Consolidate Multiple IPTV Sources
Combine streams from multiple providers into a single interface. Manage, filter, and organize thousands of channels with ease.

📺 Integrate with Media Centers
Use HDHomeRun emulation to add virtual tuners to Plex, Emby, or Jellyfin. They'll discover Dispatcharr as a live TV source and can record programs directly to their own DVR libraries.

📡 Create a Personal TV Ecosystem
Merge live TV channels with custom EPG guides. Generate XMLTV schedules or use auto-matching to align channels with existing program data. Export as M3U, Xtream Codes API, or HDHomeRun device.

🔧 Transcode & Optimize Streams
Configure output profiles with FFmpeg transcoding to optimize streams for different clients — reduce bandwidth, standardize formats, or add audio normalization.

🔐 Centralize VPN Access
Run Dispatcharr through a VPN container (like Gluetun) so all streams route through a single VPN connection. Your clients access geo-blocked content without needing individual VPNs, reducing bandwidth overhead and simplifying network management.

🚀 Monitor & Manage in Real-Time
Track active streams, client connections, and bandwidth usage with live statistics. Monitor buffering events and stream quality. Automatic failover keeps viewers connected when streams fail—seamlessly switching to backup sources without interruption.

👥 Share Access Safely
Create multiple user accounts with granular permissions. Share streams via M3U playlists or Xtream Codes API while controlling which users access which channels, profiles, or features. Network-based access restrictions available for additional security.

🔌 Extend with Plugins
Build custom integrations using Dispatcharr's robust plugin system. Automate tasks, connect to external services, or add entirely new workflows.


Why You'll Love Dispatcharr

Stream Proxy & Relay — Intercept and proxy IPTV streams with real-time client management
M3U & Xtream Codes — Import, filter, and organize playlists with multiple backend support
EPG Matching & Generation — Auto-match EPG to channels or generate custom TV guides
Video on Demand — Stream movies and TV series with rich metadata and IMDB/TMDB integration
Multi-Format Output — Export as M3U, XMLTV EPG, Xtream Codes API, or HDHomeRun device
Real-Time Monitoring — Live connection stats, bandwidth tracking, and automatic failover
Stream Profiles — Configure different stream profiles for various clients and bandwidth requirements
Flexible Streaming Backends — VLC, FFmpeg, Streamlink, or custom backends for transcoding and streaming
Multi-User & Access Control — Granular permissions and network-based access restrictions
Plugin System — Extend functionality with custom plugins for automation and integrations
Fully Self-Hosted — Total control, no third-party dependencies


Screenshots

Channels TV Guide Stats & Monitoring M3U & EPG Manager VOD Library Settings

🛠️ Troubleshooting & Help


🚀 Get Started in Minutes

docker pull ghcr.io/dispatcharr/dispatcharr:latest
docker run -d \
  -p 9191:9191 \
  --name dispatcharr \
  -v dispatcharr_data:/data \
  ghcr.io/dispatcharr/dispatcharr:latest

Customize ports and volumes to fit your setup.


🐋 Docker Compose Options

Use Case File Description
All-in-One Deployment docker-compose.aio.yml Recommended! A simple, all-in-one solution — everything runs in a single container for quick setup.
Modular Deployment docker-compose.yml Separate containers for Dispatcharr, Celery, Redis, and Postgres — perfect if you want more granular control.
Development Environment docker-compose.dev.yml Developer-friendly setup with pre-configured ports and settings for contributing and testing.

🛠️ Building from Source

⚠️ Warning: Not officially supported — but if you're here, you know what you're doing!

If you are running a Debian-based OS, use the debian_install.sh script. For other OS, contribute a script and well add it!


🤝 Want to Contribute?

We welcome PRs, issues, ideas, and suggestions!

Whether it's writing docs, squashing bugs, or building new features, your contribution matters! 🙋


📚 Documentation & Roadmap

Upcoming Features (in no particular order):

  • 🎬 VOD Management Enhancements — Granular metadata control and cleanup of unwanted VOD content
  • 📁 Media Library — Import local files and serve them over XC API
  • 👥 Enhanced User Management — Customizable XC API output per user account
  • 🔄 Output Stream Profiles — Different clients with different stream profiles (bandwidth control, quality tiers)
  • 🔌 Fallback Videos — Automatic fallback content when channels are unavailable

❤️ Shoutouts

A huge thank you to all the incredible open-source projects and libraries that power Dispatcharr. We stand on the shoulders of giants!


✉️ Connect With Us

Have a question? Want to suggest a feature? Just want to say hi?
➡️ Open an issue or reach out on Discord.


💖 Support Dispatcharr

Dispatcharr Open Collective

Open Collective provides a transparent way for anyone who finds value in Dispatcharr to support things like: • Infrastructure costs (Domains, Servers, etc.) • Apple Developer Program and Google Play Developer accounts • Helping contributors dedicate more time to improving the project

Support is completely optional, and Dispatcharr will always remain free and open-source.

Contribute here


Dispatcharr is licensed under GNU AGPL v3.0: For full license details, see LICENSE.

Dispatcharr is a trademark of the Dispatcharr project. Use of the Dispatcharr name or logo requires permission from the maintainers.


🚀 Happy Streaming! The Dispatcharr Team