๐ XC_VM v2.4.0
XC_VM v2.4.0 introduces a major change to the live-streaming architecture with the new xc_fanout daemon. Live delivery is now handled outside the PHP byte path, significantly reducing PHP-FPM overhead and improving scalability.
The release also improves Load Balancer stream handling, Ministra/Stalker compatibility, Redis and binary self-healing, documentation, CI tooling, and development workflows.
๐ New Live Streaming Architecture
-
Introduced
xc_fanout, a dedicated daemon for live-stream delivery.- Moves live TS and HLS delivery out of PHP-FPM.
- Uses nginx
X-Accel-Redirectfor client delivery. - Provides in-memory HLS segmentation and fan-out from a single source to multiple viewers.
- Supports both proxy and non-proxy stream sources.
- Supports LLOD and loopback restream feeds.
- Provides daemon-side connection tracking and per-viewer bitrate/divergence telemetry.
- Automatically detects daemon failures and recovers affected streams.
-
Made daemon delivery the only client-facing live path.
- Removed the legacy PHP non-proxy TS chase-read implementation.
- Removed PHP-based live HLS segment delivery.
- Live TS is delivered through the daemon.
- Live HLS playlists and segments are served from the daemon's in-memory segmenter.
- On-disk HLS remains available for archive/timeshift, thumbnails, analysis and monitoring, but is no longer used for live client delivery.
- When the daemon is unavailable or a stream is not fed, live delivery correctly reports the stream as unavailable instead of falling back to the old PHP byte path.
-
Moved viewer-specific overlays into
xc_fanout.- The admin "Send Message" feature now sends signals through the daemon control socket.
- Messages are rendered onto the viewer's next HLS segment or short TS window.
- Automatically selects an FFmpeg build with
drawtextsupport when overlays are enabled.
-
Added automatic daemon lifecycle management.
- Automatic installation and updates.
- Supervision and self-healing.
- Automatic re-feed of orphaned streams after daemon restarts.
- Connection reconciliation to remove stale viewer records.
- Recovery from dropped daemon and Redis connections.
These changes complete the migration away from the legacy PHP streaming architecture and remove the previous viewer-proportional PHP-FPM overhead. PRs: #157, #158.
โก Load Balancer & Shared Storage Improvements
-
Fixed symlink processing on Load Balancer nodes when media is stored on shared mounts.
- LB nodes now detect files that are physically available through shared storage instead of assuming that a different recorded server ID means the file must be fetched remotely.
- Prevents unnecessary FFmpeg processing and HTTP transfers.
- Prevents unnecessary storage consumption caused by copying media instead of creating symlinks.
-
Added configurable Shared Mount Prefixes in Settings โ Streaming.
- Supports multiple shared mount paths.
- Replaces the previous hardcoded mount detection.
- Existing CSV values are automatically migrated to the new JSON format.
- Changes are reflected immediately without stale admin settings cache.
๐ Redis & Binary Self-Healing
-
Improved Redis health checks and recovery.
- Invalid health-check responses are no longer treated as healthy.
- Improved reconnect and watchdog fallback behavior.
- Prevented recovery logic from accidentally using the wrong Redis database.
- Added automatic recovery of local Redis instances when health checks detect a dead service.
-
Added MAIN โ LB Redis support required by the new streaming architecture.
-
Added automatic
xcvm_coreself-update for Load Balancers.- Uses ABI-aware binary/extension updates.
- Verifies downloaded files with SHA-256.
- Performs atomic replacement with rollback protection.
- Keeps LB binaries compatible with the current panel version.
-
Added automatic yt-dlp updates.
cron:root_signalschecks for new releases once per day.- Works on MAIN and LB nodes.
- Downloads the latest upstream release only when the installed version is outdated.
- Verifies the upstream SHA-256 checksum.
- Runs the downloaded binary before installation.
- Performs an atomic replacement so a broken update cannot replace a working binary.
- Added the installed yt-dlp version to Settings โ Info.
๐บ Ministra / Stalker Portal
-
Moved the Ministra/Stalker portal from a module into XC_VM core.
-
Updated the portal to Ministra 5.6.10.
-
Restored XC_VM-specific customizations including:
- channel logos;
- parent-control behavior;
- the XC_VM search/quality interface;
- existing portal integrations.
-
Added the
get_types_listaction required by Ministra 5.6.10 for STB type validation. -
Removed obsolete and unreachable Ministra modules and their associated assets.
-
Improved browser/STB emulation and debug handling.
-
Fixed missing logos and compatibility issues introduced by the upstream portal update.
๐ Installation & Infrastructure
- Improved automatic installation and updating of
xc_fanout. - Added support for downloading the proxy archive from XC_VM_Proxy releases during installation and keeping it updated.
- Improved binary provisioning on MAIN and LB nodes.
- Added
libogg0to supported package lists for Debian 13 and Ubuntu 20/24. - Improved recovery of streaming services after daemon, Redis or watchdog failures.
- Added better diagnostics for database and streaming failures.
- Added server-origin information to panel logs to distinguish MAIN and LB failures.
- Improved
LINE_CREATE_FAILdiagnostics by exposing the underlying database error. - Improved handling of database connection limits and excessive connection counts.
๐จ Admin & Panel Improvements
- Added dynamic Shared Mount Prefix configuration to the admin interface.
- Improved admin branding and footer.
- Updated login page and version badges.
- Added dynamic admin profile dropdown handling through the Navbar registry.
- Improved asset revalidation to prevent stale JavaScript/CSS after updates.
- Improved error reporting and null-safety throughout streaming, provider, player, admin API and domain components.
๐ Documentation
-
Replaced the old Docsify documentation with MkDocs Material.
-
English documentation is now the single source of truth.
-
Russian documentation is automatically generated from English.
-
Added a language switcher and separate:
- User Guide
- Developer Guide
-
Added strict documentation builds with broken-link and anchor validation.
-
Added a local documentation translation pipeline with:
- multiple translation providers;
- Markdown/code/URL protection;
- glossary protection;
- SHA-256 translation caching;
- validation and retry handling.
-
Added documentation for:
xc_fanout;- the new live-streaming architecture;
- daemon telemetry and recovery;
- Redis idle-connection resilience;
- cold-cache behavior;
- Load Balancer architecture;
- yt-dlp self-updates;
- Ministra 5.6.10;
- server diagnostics and heartbeat mechanisms.
-
Added Architecture Decision Records covering the new streaming architecture.
PR: #159.
๐งน Refactoring & Cleanup
- Removed the legacy
ProxyCommandstreaming path. - Removed the legacy PHP
.tschase-read implementation. - Removed the obsolete PHP live HLS delivery path.
- Removed
SegmentReaderand its tests. - Removed the obsolete
SignalSenderimplementation after moving overlays intoxc_fanout. - Removed redundant proxy and streaming process checks.
- Removed obsolete Ministra modules.
- Removed unused
BoundaryInterfaceand redundant database imports. - Cleaned up namespaces and imports across the project.
- Removed duplicate and dead code left from the previous streaming architecture.
๐งช Code Quality & CI
-
Replaced PHP-CS-Fixer with PHP_CodeSniffer + Slevomat Coding Standard.
- More accurate unused-import detection.
- Preserves imports used in actual PHPDoc types.
- Added focused namespace/import hygiene rules.
- Updated
make csandmake cs-fix. - Cleaned up unused imports across 85 source files.
- Updated CI and development documentation.
PR: #161.
- Updated
actions/github-scriptfrom v7 โ v9. - Added compatibility with the newer GitHub Actions runtime and Node.js 24 environment.
- Improved release and deployment workflow automation.
- Added
workflow_dispatchsupport for release notifications. - Added project-level AI development guidelines in
CLAUDE.md. - Added incident template and updated CODEOWNERS.
PR: #155.
๐ Important Bug Fixes
- Fixed database connection overflow caused by exceeding the configured connection limit.
- Fixed dead and wedged watchdog processes not being restarted correctly.
- Fixed cron jobs terminating active streaming sessions.
- Fixed daemon liveness detection and recovery.
- Fixed Redis health checks and reconnect behavior.
- Fixed cold-cache streaming failures.
- Fixed MPEG-TS segmentation with On Demand + LLOD v2.
- Fixed symlink processing on Load Balancers.
- Fixed stale JavaScript/CSS assets after updates.
- Fixed GeoIP database recovery when the local database is missing.
- Fixed Ministra portal compatibility and restored XC_VM-specific functionality.
- Fixed migration parsing for SQL comments containing
--. - Fixed Redis password synchronization after rotation.
- Fixed proxy update handling when releases are unavailable versus GitHub being unavailable.
- Fixed multiple installation and binary provisioning issues across supported Linux distributions.
- Improved null-safety and error handling across multiple application subsystems.
๐ฅ Contributors
- @404errordeveloper โ first contribution to XC_VM, implementing the Load Balancer shared-storage/symlink improvements in PRs #153 and #154.
- @Divarion-D โ Ministra 5.6.10 migration,
xc_fanoutarchitecture and daemon migration, documentation migration, code-quality tooling, and yt-dlp self-updates. - @dependabot[bot] โ GitHub Actions dependency update.
๐ Pull Requests
- #149 โ Move Ministra/Stalker portal from module into core
- #151 โ Update Ministra portal to 5.6.10
- #153 โ Fix symlink handling on Load Balancers with shared storage
- #154 โ Add configurable Shared Mount Prefixes
- #155 โ Update
actions/github-scriptfrom v7 to v9 - #157 โ Move live delivery to
xc_fanoutdaemon - #158 โ Complete daemon-only client TS/HLS delivery
- #159 โ Migrate documentation to MkDocs Material
- #161 โ Replace PHP-CS-Fixer with PHPCS + Slevomat
- #162 โ Add automatic daily yt-dlp updates
๐ฏ Summary
XC_VM v2.4.0 is primarily a streaming architecture release.
The previous PHP-based live delivery path has been replaced by the xc_fanout daemon, with nginx handling client delivery and PHP remaining outside the live byte path. This provides a more scalable architecture, removes viewer-proportional PHP-FPM overhead, improves Load Balancer operation, and introduces automatic stream recovery and daemon self-healing.
Alongside the streaming migration, this release updates Ministra to 5.6.10, improves Redis and binary recovery, adds automatic yt-dlp maintenance, replaces the documentation platform, modernizes code-quality tooling, and significantly improves the reliability of MAIN and Load Balancer nodes.
Thanks to all contributors and everyone testing, reporting issues, and helping improve XC_VM! ๐
Full Changelog: 2.3.9...2.4.0