github Vateron-Media/XC_VM 2.4.0
v2.4.0

pre-release4 hours ago

๐Ÿš€ 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-Redirect for 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 drawtext support 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.

PRs: #153, #154.

๐Ÿ”„ 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_core self-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_signals checks 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.

PRs: #157, #162.

๐Ÿ“บ 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_list action 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.

PRs: #149, #151.

๐Ÿ›  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 libogg0 to 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_FAIL diagnostics 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 ProxyCommand streaming path.
  • Removed the legacy PHP .ts chase-read implementation.
  • Removed the obsolete PHP live HLS delivery path.
  • Removed SegmentReader and its tests.
  • Removed the obsolete SignalSender implementation after moving overlays into xc_fanout.
  • Removed redundant proxy and streaming process checks.
  • Removed obsolete Ministra modules.
  • Removed unused BoundaryInterface and 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 cs and make cs-fix.
    • Cleaned up unused imports across 85 source files.
    • Updated CI and development documentation.

PR: #161.

  • Updated actions/github-script from v7 โ†’ v9.
  • Added compatibility with the newer GitHub Actions runtime and Node.js 24 environment.
  • Improved release and deployment workflow automation.
  • Added workflow_dispatch support 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_fanout architecture 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-script from v7 to v9
  • #157 โ€” Move live delivery to xc_fanout daemon
  • #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

Don't miss a new XC_VM release

NewReleases is sending notifications on new releases.