Skip to content
CAI
Software that uses CAICheck a score

bytedance/xgplayer

48.0

Weak · 2 October 2026

52.8k

lines of production code

JavaScript

with TypeScript

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a modular, plugin-based video and audio player framework designed for web environments. It provides core playback capabilities alongside specialized extensions for streaming protocols like HLS, DASH, and FLV, as well as features for advertising, casting, and audio visualization. The architecture supports extensive customization through a hook system, handling everything from low-level media transmuxing and DRM to high-level UI controls and accessibility.

How it got here

2018–2023 — xgplayer v3 architecture and plugin ecosystem

85 changes.

This period focused on the comprehensive development of the xgplayer v3 core architecture, establishing a modular, plugin-based framework with robust event and error handling systems. It involved the creation and integration of diverse streaming plugins for FLV, HLS, DASH, and MP4, alongside specialized modules for music playback, subtitles, and advanced UI controls. The work also encompassed building the underlying transmuxing and parsing infrastructure, implementing low-latency streaming features, and establishing automated monorepo tooling for testing and release.

2024–2026 — advertising and casting plugin development

14 changes.

This period focused on introducing and refining the xgplayer-ads and xgplayer-cast plugins, integrating Google IMA for ad management and supporting AirPlay and Chromecast for wireless playback. Significant work included implementing dedicated UI controls for ad states, rewriting casting platform integrations in TypeScript for improved reliability, and adding comprehensive test coverage for these new features alongside core transmuxer and subtitle security fixes.

Features

Add DashPlugin for DASH stream playback

Introduces the DashPlugin, enabling playback of DASH (Dynamic Adaptive Streaming over HTTP) content within xgplayer. This addition includes the core DASH engine (dash.js) for parsing MPD manifests and managing media segments, a Media Source Extensions (MSE) wrapper (mse.js) for handling source buffers and buffering logic, and an Encrypted Media Extensions (EME) module (eme.js) to support DRM-protected content via ClearKey. The plugin integrates with the xgplayer architecture to provide features such as adaptive bitrate switching, live stream support, and error handling.

packages/xgplayer-dash/src · high confidence

Add FPS detection plugin to report playback stalls

The new FpsDetect plugin monitors video playback performance by periodically checking decoded frame counts. It detects when the player appears stuck (based on a configurable number of consecutive low-frame intervals) and emits an FPS\_STUCK event, allowing applications to identify and react to playback issues.

packages/xgplayer/src/plugins/fpsDetect · high confidence

Add Picture-in-Picture plugin with Document PiP support

Introduces a new Picture-in-Picture (PiP) plugin for xgplayer, allowing users to toggle video playback in a floating window. The plugin supports both standard browser PiP and the Document Picture-in-Picture API (when enabled via the \preferDocument\ config option), including style copying and window sizing. It adds a control icon to the player UI that switches between entering and exiting PiP mode, handling state changes and event propagation safely.

packages/xgplayer/src/plugins/pip · high confidence

Add Play/Pause control button to video player controls

Introduces a new Play plugin that adds a toggle button to the left side of the player controls, allowing users to start or stop video playback. The button dynamically switches between play and pause icons based on the current state and handles replay logic when the video has ended.

packages/xgplayer/src/plugins/play · high confidence

Add Rotate plugin for video orientation control

Introduces a new Rotate plugin that allows users to rotate the video player or video content by 90-degree increments. The plugin adds a control button to the player interface and supports configuration for rotation direction (clockwise/counter-clockwise), whether to rotate the entire player or just the video content (inner rotation), and an initial rotation angle. It handles touch and click events with a debounce mechanism to prevent double-firing, and updates the video transform styles accordingly.

packages/xgplayer/src/plugins/rotate · high confidence

Add mini-screen plugin for picture-in-picture style playback

Introduces a new 'miniscreen' plugin that allows the video player to shrink into a small, draggable floating window (default 320x180px) while continuing playback. Users can toggle this mode via a new control icon, and the player supports automatic mini-screen activation on scroll, custom positioning, and drag-and-drop repositioning within the viewport.

packages/xgplayer/src/plugins/miniScreen · high confidence

Add music-mode plugin components and styles

Introduces a set of new plugins for the xgplayer-music package that provide a dedicated music-player interface. This includes UI controls for backward, forward, next, and previous tracks, a cover art display plugin, and a metadata plugin for showing the track title. The entry also adds the corresponding SCSS styles to layout the controls bar, hide the progress bar, and position the cover and title elements within the player.

packages/xgplayer-music/src/plugins · high confidence

Add start plugin for play/pause overlay control

Introduces the 'start' plugin for xgplayer, which provides a central play/pause overlay button. This feature allows users to toggle playback via click or touch events, displays distinct play and pause icons based on the current state, and includes configurable animation effects and visibility modes (hide, show, auto) to manage the overlay's appearance during autoplay, reset, and other player states.

packages/xgplayer/src/plugins/start · high confidence

Added Cast plugin demo fixture with Chromecast and AirPlay controls

A new demo fixture at fixtures/cast/index.html and index.js has been added to showcase the xgplayer-cast plugin. This page provides a user interface for testing casting functionality, including buttons to initiate Chromecast and AirPlay sessions, remote playback controls (play, pause, seek, stop), and a diagnostics panel that displays real-time state information. It also supports a fake Chromecast mode via URL parameters to test plugin logic and failure paths without physical hardware.

fixtures/cast · high confidence

Added DASH segment parsing infrastructure

The DASH parser now includes support for reading MP4 box structures and Segment Index (sidx) boxes. This change introduces a new Box class for handling container and specific box types, a Stream class for binary data reading, and a UTC date helper, enabling the player to correctly parse segment timing and indexing information from DASH manifests.

packages/xgplayer-dash/src/parse · high confidence

Added FLV player test fixture

Added a new interactive test page at fixtures/flv that allows users to configure and verify FLV playback parameters (such as retry counts, timeouts, and buffer settings) and inspect player events and status in real-time.

fixtures/flv · high confidence

Added HLS and DASH player test fixtures

New interactive test pages for HLS and DASH playback have been added to the fixtures directory. The HLS fixture provides a comprehensive UI for testing player behavior, including controls for playback, seeking, URL switching, and stream switching, along with configurable parameters for retry logic, buffering, and live stream latency. The DASH fixture provides a basic setup for testing DASH playback with DRM options.

fixtures/hls · high confidence

Added MP4 and music player demo fixtures

New demo pages have been added to the fixtures directory to showcase the MP4 and music player capabilities. The MP4 fixture provides an interactive demo with multiple resolution options (360p to 1080p), thumbnail support, and a 'play next' feature, while the music fixture sets up the structure for an audio player with canvas visualization support.

fixtures/mp4 · high confidence

Added TestSpeed plugin for network performance monitoring

Introduced a new TestSpeed plugin that enables periodic network speed testing for video players. The plugin measures download speeds by sending XMLHttpRequests with byte-range headers at configurable intervals, caching the results, and exposing average and real-time speed metrics on the player instance. It supports multiple speed types (defaulting to 'cdn') and allows users to configure parameters such as test count, load size, and time steps, while automatically emitting download speed change events when metrics update.

packages/xgplayer/src/plugins/testspeed · high confidence

Added internationalization support for 13 new languages

The xgplayer library now includes translation resources for 13 additional languages: Brazilian Portuguese (br), German (de), Spanish (es), French (fr), Indonesian (id), Italian (it), Japanese (jp), Korean (kr), Malay (ms-my), Russian (ru), Thai (th), Vietnamese (vn), and Traditional Chinese (zh-hk). These new language files, alongside the existing English and Simplified Chinese resources, allow the player interface to display text in these languages, covering UI elements such as playback controls, error messages, and status indicators.

packages/xgplayer/src/lang · high confidence

Added playback rate control plugin

Introduced a new playback rate plugin that allows users to adjust video speed via a control in the player interface. The plugin supports a configurable list of rates (defaulting to 2x, 1.5x, 1x, 0.75x, and 0.5x), automatically formats these options with 'x' suffixes, highlights the currently active rate, and updates the display when the playback speed changes.

packages/xgplayer/src/plugins/playbackRate · high confidence

Added xgplayer fixture demos for basic playback and danmaku

New fixture files (danmu.html, danmu.js, index.html, index.js) have been added to the fixtures/xgplayer directory. These provide a minimal basic player demo and a specific example demonstrating the Danmu (bullet comment) plugin configuration, including comment data, styling, and area settings.

fixtures/xgplayer · high confidence

Adds definition switching, network adaption, prompt overlay, and replay plugins to xgplayer

This change introduces four new plugins to the xgplayer library: a Definition plugin that allows users to manually switch video quality (hiding the control if fewer than two options are available); a NetAdaption plugin for live streams that automatically adjusts playback speed based on buffer health (speeding up if buffer is large, slowing down if small); a Prompt plugin providing a customizable, auto-hiding overlay for user notifications with optional highlighted clickable text; and a Replay plugin that displays a replay button when a video ends (unless looping is enabled).

(repo-wide) · high confidence

Automated release workflow scripts for versioning and publishing

Added a suite of scripts in the \scripts/workflow\ directory to automate the release process. This includes \set-package-version.mjs\ to update package versions and internal dependencies across the monorepo, \npm-publish.mjs\ to handle publishing while respecting a block list and checking for existing versions, \create-github-release.js\ to generate and update GitHub release notes, and \create-release-pr.js\ to open a release pull request. Supporting utilities in \version-helper.mjs\ and \get-package-version.mjs\ manage version parsing, comparison, and tag retrieval.

scripts/workflow · high confidence

Initial MPD parsing support for DASH streams

The xgplayer-dash package now includes core logic to parse DASH Media Presentation Description (MPD) files. This change introduces an MPD parser that handles XML namespace prefixes and extracts key stream metadata, including video and audio codecs, resolution, bandwidth, and segment URLs. It also adds an XML-to-JSON utility to facilitate the parsing process, enabling the player to correctly identify and load DASH content segments.

packages/xgplayer-dash/src/m4s · high confidence

Initial implementation of MP4 parsing and transmuxing utilities

This change introduces the core utility infrastructure for the xgplayer-mp4 package, including a Download helper for file saving, a Timer class for managing asynchronous delays, a ProxyPromise for controlled promise resolution, and a Logger that conditionally outputs debug messages based on localStorage settings. It also adds a Worker control layer (TransmuxerWorkerControl) and the actual Web Worker (transmuxerworker.js) that offloads MP4 demuxing and FMP4 remuxing tasks to a background thread using the xgplayer-transmuxer library, enabling smoother playback performance.

packages/xgplayer-mp4/src/util · high confidence

Initial release of Shaka Player integration plugin

Introduces a new extension plugin for xgplayer that integrates the Shaka Player library to handle media playback. This addition enables users to leverage Shaka's capabilities, including browser support checks, configuration options via \shakaOpts\, and automatic handling of variant tracks for quality selection.

packages/xgplayer-shaka · high confidence

Initial release of the controls plugin with flex layout and auto-hide support

This change introduces the \controls\ plugin for xgplayer, providing the core UI layer for video playback controls. It implements a layout system supporting 'flex', 'normal', and 'bottom' modes, with 'flex' automatically enabled on mobile devices. The plugin handles control visibility through auto-hide logic triggered by mouse enter/leave events and player focus state, and includes specific styling for mini-player mode and safe-area insets on mobile devices.

packages/xgplayer/src/plugins/controls · high confidence

Initial release of the xgplayer-hls plugin

This change introduces the new \xgplayer-hls\ plugin, providing HLS streaming capabilities for the xgplayer framework. The plugin exposes the \HlsPlugin\ class and associated error codes, and implements core HLS features including dynamic source switching via \switchURL\ (with Promise support), live stream replay, and soft decoding fallback for non-video media types. It also integrates with the player's event system to expose detailed streaming metrics and lifecycle events such as buffer operations, manifest loading, and decryption status.

packages/xgplayer-flv.js/src, packages/xgplayer-hls.js, packages/xgplayer-hls/src · high confidence

Initial release of xgplayer-dash utility module

This change introduces the initial implementation of the xgplayer-dash package's utility layer, providing core helper functions for DASH media playback. The new code includes data conversion utilities (such as ArrayBuffer/String/Base64/Hex transformations), MPD (Media Presentation Description) parsing helpers like duration conversion and box finding, and a custom XHR wrapper to handle HTTP requests with specific response types and data formatting required for DASH stream initialization.

packages/xgplayer-dash/src/util · high confidence

Initial v3 HLS engine release with low-latency and MSE enhancements

This change introduces the v3 architecture for the HLS player, replacing the previous implementation with a new core engine located in src/hls. The new engine includes a dedicated configuration system (config.ts) with sensible defaults for low-latency streaming (useLowLatency: true, mseLowLatency: true) and MSE attachment modes. It adds support for Low-Latency HLS (LL-HLS) via reduced m3u8 intervals, introduces a new \preferMMS\ option to leverage ManagedMediaSource where available, and exposes new events like \core.appendcost\ and \core.seipayloadtime\ for better performance monitoring and SEI data handling. The API surface is updated with a new \load\ method signature and options like \clearSwitchStatus\ to manage state during URL switches.

packages/xgplayer-hls/src/hls · high confidence

Introduce MP4Loader package with robust MP4/fMP4 parsing and sync fixes

This change introduces the new \xgplayer-mp4-loader\ package, providing a dedicated loader for MP4 and fMP4 files. It includes a new \Cache\ implementation, a \GopItem\ helper for efficient keyframe/GOP identification, and a \MediaError\ class for structured error reporting. The loader addresses several playback issues: it fixes audio-video desynchronization by refining audio grouping and sync strategies, corrects MP4 edit-list (edts) time offsets, guards against empty CTTS offsets, and handles negative DTS values to ensure compatibility with older browsers like Chrome M75-. It also improves performance by reducing memory allocations during parsing and ensures small files under 800KB load correctly.

packages/xgplayer-mp4-loader · high confidence

Introduce dedicated MP4 streaming plugin with structured error handling

Adds a new \xgplayer-mp4\ plugin that provides native MP4 playback capabilities, including support for fragmented MP4 (fMP4), dynamic source switching, and video-only streams. The implementation introduces a dedicated error management system (\error.js\) that maps HTTP status codes and parser issues to standardized error codes, improving diagnostic clarity for network and media errors. The plugin also integrates with the \xgplayer-transmuxer\ for demuxing/remuxing and supports worker-based processing for performance optimization.

packages/xgplayer-mp4/src · high confidence

Introduce libd CLI and build tooling for automated releases

The \scripts\ directory now contains a new CLI (\cli.js\) and build infrastructure (\context.js\, \rollup.base.js\, \rollup.prod.js\) for the \libd\ tool. This adds commands for development (\dev\), building packages (\build\), generating changelogs (\changelog\), and releasing (\release\), enabling automated publishing workflows. The build system supports ES, CJS, and UMD formats, handles TypeScript detection, manages monorepo dependency resolution, and allows configuration via \libd.config.js\.

scripts · high confidence

Introduce new build utility modules for configuration, legacy support, and logging

This change adds several new JavaScript utility files to the \scripts/utils\ directory to support the build system. \config.js\ provides Vite configuration logic, including alias resolution, plugin setup (React, SVG handling, externals), and CSS preprocessing options. \legacy/index.js\ implements a custom Rollup/Babel plugin to handle legacy browser polyfills using \core-js\ and \@babel/preset-env\. \logger.js\ introduces a colored, structured logging interface for build output and error handling. \index.js\ acts as the main entry point, exporting these utilities along with helper functions for package installation and UMD name resolution.

scripts/utils · high confidence

Introduce streaming-shared package with network validation and error handling

The new xgplayer-streaming-shared package provides shared utilities for video streaming, including a FetchLoader and XhrLoader that now validate range requests by rejecting responses that are not 206 (unless redirected) and ensuring the returned byte range matches the request. It also introduces a centralized error system with specific error codes for network, demux, and media issues, alongside a configurable Logger and dynamic timeout mechanisms (EWMA and Jacobson-Karels) to improve network reliability and debugging.

packages/xgplayer-streaming-shared · high confidence

Introduce time display plugin and time segments control

Adds the \time\ plugin to display current and total duration, supporting both standard and flex control bar layouts, and introduces the \TimeSegmentsControls\ plugin to enable playback of disjointed time segments by mapping player time to configured segment offsets.

packages/xgplayer/src/plugins/time · high confidence

Introduce xgplayer v3 core player architecture

This change introduces the core v3 player architecture for xgplayer, establishing a new foundation with a centralized configuration system (defaultConfig.js) and a dedicated instance manager (InstManager.js) to handle multiple player instances and memory management. It adds a comprehensive event system (events.js) and a structured error handling module (error.js) that categorizes errors by type (e.g., network, DRM, ad) and provides detailed diagnostic data. The player now supports a plugin-based UI with a default preset (index.umd.js) and exposes a robust API for URL switching, playback control, and state management, while also introducing new capabilities like Picture-in-Picture, CSS fullscreen, and keyboard shortcuts.

packages/xgplayer/src · high confidence

Introduce xgplayer-ads plugin with IMA SDK integration and ad UI management

This change adds the \xgplayer-ads\ plugin, enabling video advertising via the Google IMA SDK. It introduces a \BaseAdManager\ and \ImaAdManager\ to handle ad lifecycle, SDK loading, and content blocking logic (including specific handling for Tizen and WebOS TVs). An \AdUIManager\ is included to manage ad-specific UI states, such as hiding the replay component during ads and managing container visibility. The plugin exposes standard ad events (e.g., \ad\_start\, \ad\_error\) and provides a UMD export for easier integration.

packages/xgplayer-ads/src · high confidence

Introduce xgplayer-cast plugin with AirPlay and Chromecast support

Adds a new Cast plugin for xgplayer that enables wireless casting to AirPlay and Chromecast devices. The plugin manages device availability, updates UI icons based on the active protocol, and handles playback state handoffs, including preserving resume time for AirPlay sessions and supporting localized strings for Chinese and English.

packages/xgplayer-cast/src · high confidence

Introduce xgplayer-music plugin with playlist, lyric, and audio analysis capabilities

Adds the \xgplayer-music\ plugin, providing a dedicated music player experience built on xgplayer. This includes a \Music\ plugin for managing playlists with various play modes (order, loop, random), an \Analyze\ plugin for audio visualization, and a \Lyric\ plugin that parses and displays synchronized lyrics with support for dynamic text and offset adjustments. The package also provides a \MusicPreset\ that bundles these features with standard music controls (prev, next, forward, backward, cover, metadata) and a default theme.

packages/xgplayer-music/src · high confidence

Introduction of dedicated BufferService for HLS media handling

The HLS module now uses a new \BufferService\ class to manage media source extension (MSE) and soft decoding workflows. This service centralizes buffer management, including the creation of source buffers, appending of video and audio segments, and handling of time offsets. It introduces new events such as \MEDIASOURCE\_OPENED\ and \APPEND\_BUFFER\ to expose internal buffering states to the player, and supports configuration options like \softDecode\ and \preferMMS\ to tailor media processing behavior.

packages/xgplayer-hls/src/hls/buffer-service · high confidence

Introduction of modular HLS decryptor with external provider support

The HLS buffer service now uses a dedicated Decryptor class located in the decrypt module to handle media segment decryption. This implementation supports AES-CBC decryption via the Web Crypto API and introduces the ability to inject an external decryptor (IExternalDecryptor) for custom decryption logic. The module also includes a destroy method to clean up external resources, ensuring proper lifecycle management when the HLS instance is torn down.

packages/xgplayer-hls/src/hls/buffer-service/decrypt · high confidence

Introduction of the xgplayer-flv plugin with MSE-based playback and degradation support

This change introduces the new \xgplayer-flv\ plugin, enabling FLV video playback via Media Source Extensions (MSE). The plugin supports both live and VoD streams, handles URL switching (including seamless switches), and provides a fallback mechanism that degrades to standard HTML5 video playback when MSE is unavailable or performance is low. It also exposes various streaming events and statistics for monitoring playback health.

packages/xgplayer-flv/src · high confidence

Introduction of xgplayer-flv v3 core implementation

This change introduces the new v3 core implementation for the FLV player module, replacing the previous codebase with a fresh architecture in packages/xgplayer-flv/src/flv. The new Flv class integrates shared streaming services (NetLoader, Buffer, MSE, BandwidthService, etc.) and exposes configuration options for retry logic, latency management, and seamless switching. It also adds support for specific device behaviors (such as Tizen and iOS 17.1+), transfer cost tracking, and new events like 'chaseframe' and 'core.mediasourceopended' to improve playback stability and debugging capabilities.

packages/xgplayer-flv/src/flv · high confidence

New CLI commands for building, demo serving, and automated releases

The build tooling now includes dedicated CLI commands for managing the development lifecycle. A new \build-demo\ command allows building individual demo applications using Vite, while the main \build\ command has been rewritten to support multi-threaded parallel builds via Node worker threads, improving build performance for monorepos. Additionally, new commands have been added to automate the release process (\release\), generate changelogs (\changelog\), manage local package linking (\link\), and start the development server (\dev\), providing a comprehensive set of tools for library development and publishing.

scripts/commands · high confidence

New HLS manifest parser with low-latency and DRM support

The HLS manifest loader now uses a new parser implementation that supports low-latency streaming (LL-HLS) via the useLowLatency option, parses DATERANGE and PROGRAM-DATE-TIME tags, and supports additional DRM key systems (ClearKey, FairPlay, Widevine, PlayReady). The parser also handles EXT-X-ENDLIST appearing anywhere in the playlist and filters out segments with zero duration.

packages/xgplayer-hls/src/hls/manifest-loader/parser · high confidence

New HLS playlist and stream management classes

Added new \Playlist\ and \Stream\ classes in \packages/xgplayer-hls/src/hls/playlist\ to manage HLS media segments, streams, and subtitles. These classes handle segment indexing, live edge tracking, DVR window calculations, and low-latency playback points, providing the core data structures for the HLS parser and player integration.

packages/xgplayer-hls/src/hls/playlist · high confidence

New Heatmap plugin for video progress visualization

A new Heatmap plugin has been added to xgplayer, allowing users to visualize engagement or interaction data along the video progress bar. The plugin renders a canvas-based heatmap overlay that can be configured with custom data, gradient colors, line width, and opacity. It supports two display modes: 'normal' (always visible) and 'activeShow' (visible only when the progress bar is active). The implementation includes logic to format time-based data into percentage-based coordinates relative to the video duration, ensuring the heatmap scales correctly with video length and player resize events.

packages/xgplayer/src/plugins/heatmap · high confidence

New MP4 parsing and remuxing engine with EME support

The \packages/xgplayer-transmuxer/src/mp4\ directory now contains a complete, new implementation of the MP4 parsing and remuxing pipeline, replacing the previous logic. This update introduces dedicated \FMP4Demuxer\ and \FMP4Remuxer\ classes for fragmented MP4 handling, alongside updated \MP4Demuxer\ and \MP4Remuxer\ classes for standard MP4. A key addition is the new \crypto.js\ module, which enables Encrypted Media Extensions (EME) support by allowing custom decryption handlers for AES-CTR encrypted tracks. The parser has been enhanced to correctly extract video rotation and matrix data from the \tkhd\ box, and the remuxer now supports generating init segments for VVC (H.266) and AV1 codecs.

packages/xgplayer-transmuxer/src/mp4 · high confidence

New MP4 playback plugin with soft-decode fallback

Introduces a new \xgplayer-mp4-new\ package that provides an MP4 playback plugin. The plugin utilizes Media Source Extensions (MSE) for standard playback but automatically falls back to a soft-decode path (using the native video element's \appendBuffer\) when MSE is unavailable or when the media type is not 'video' or 'offscreen-video'. It includes a dedicated \BufferService\ to handle demuxing, remuxing, and buffer management, and integrates with the player's URL and definition change events.

packages/xgplayer-mp4-new · high confidence

New PC plugin for mouse and click interactions

A new PC plugin has been added to handle mouse events (mouseenter, mouseleave, mousemove) and click/double-click actions on the video player. This plugin introduces ENTER\_PLAYER and LEAVE\_PLAYER events, manages focus and blur states based on configuration options like closeDelayBlur and leavePlayerTime, and handles video click/double-click behaviors such as play/pause toggling and fullscreen switching. It also respects the enableContextmenu configuration to control right-click behavior and prevents interference with mobile touch events when in simulate mode.

packages/xgplayer/src/plugins/pc · high confidence

New buffer and transfer-cost services for FLV playback

The FLV player now uses dedicated \BufferService\ and \TransferCost\ modules to manage media buffering and performance metrics. \BufferService\ handles demuxing, remuxing, and MSE buffer appending, introducing support for \onlyVideo\ and \onlyAudio\ options to filter tracks, and implementing logic to clear old buffer data when switching quality levels. \TransferCost\ tracks timing for TTFB, demux, remux, and append stages, emitting these metrics via \TRANSFER\_EVENT\ to help users monitor playback performance.

packages/xgplayer-flv/src/flv/services · high confidence

New codec parsers and video codec registry for VVC, HEVC, AAC, MP3, and Opus

The transmuxer now includes dedicated parsers for VVC, HEVC, AAC, MP3, and Opus, along with a new video codec registry that allows external registration of video codecs. This enables the library to correctly parse and handle these audio and video formats, including support for standard VVC and BVC2 codec parsing, and fixes for MP3 audio playback and Chrome-specific AAC objectType defaults.

packages/xgplayer-transmuxer/src/codec · high confidence

New common UI components for options lists and thumbnails

This change introduces new shared UI components for the xgplayer controls: an OptionsIcon plugin that renders configurable lists with support for side/middle/default layouts, click/hover toggle modes, and mobile-specific behaviors; an OptionList helper for rendering and managing list item selection; a Thumbnail plugin for displaying video preview thumbnails via sprite sheets; and an Icon plugin for handling mouse enter/leave events. These components provide the underlying infrastructure for interactive control bar elements.

packages/xgplayer/src/plugins/common · high confidence

New danmu plugin with toggle icon, settings panel, and seek synchronization

The danmu plugin now includes a dedicated toggle icon (danmuIcon) and a configuration panel (danmuPanel) for adjusting speed, opacity, font size, and display area. It also synchronizes barrage playback with video seeking, ensuring danmu pauses during seeking and resumes after the seek completes, while respecting the player's paused state.

packages/xgplayer/src/plugins/danmu · high confidence

New dynamic background plugin for video players

A new 'dynamicBg' plugin has been added to xgplayer, allowing the video content to be used as a blurred, animated background behind the player controls. Users can configure the rendering mode (realtime, first frame, framerate, or poster), adjust the blur filter intensity, control the frame rate, and enable a semi-transparent mask overlay. The plugin automatically detects canvas support and integrates with standard video events like play, pause, and loaded data to manage the background rendering lifecycle.

packages/xgplayer/src/plugins/dynamicBg · high confidence

New interactive Ads demo fixture for IMA integration testing

Added a new \fixtures/ads\ directory containing an HTML/JS demo page that allows users to manually configure and test the xgplayer-ads plugin with Google IMA. The demo provides a UI to select various IMA ad tag presets (including linear, non-linear, VMAP, and VPAID scenarios), toggle autoplay and controls, and switch between using AdsRequest or AdsResponse for ad loading, facilitating easier local testing and debugging of ad behaviors.

fixtures/ads · high confidence

New low-level binary parsing utilities in xgplayer-transmuxer

The transmuxer package now includes a new set of utility classes in the \src/utils\ directory to handle binary data and codec-specific parsing. This adds \ByteReader\ for reading integers, floats, and strings from byte buffers, \BitReader\ for bit-level extraction, and \ExpGolomb\ for decoding exponential-Golomb codes used in video codecs like H.264/HEVC. It also introduces \UTF8\ for decoding byte arrays to strings, \Logger\ for controlled console output, and \env\ helpers for browser/OS detection. These utilities provide the foundational parsing capabilities required for the package's media processing logic.

packages/xgplayer-transmuxer/src/utils · high confidence

New mobile plugin with gesture controls and dark mode support

The xgplayer mobile plugin has been introduced to handle touch interactions on mobile devices. It supports horizontal and vertical gestures for seeking and playback rate adjustment, along with a dimming (darkness) overlay that respects the system's dark color scheme. The plugin includes a seek progress indicator and handles touch events to prevent default browser behaviors when gestures are enabled.

packages/xgplayer/src/plugins/mobile · high confidence

New player plugins and audio visualization components

This release introduces several new capabilities for the video player. The \xgplayer-music\ package adds an audio analysis module with multiple visualization modes (bars, waves, lightning, etc.) for rendering audio data on a canvas. The core player gains new plugins: \cssFullScreen\ for CSS-based fullscreen toggling, \enter\ for a custom loading spinner overlay, \error\ for displaying error states with retry options, \gapJump\ to automatically skip silent gaps in video playback, \loading\ for a standard loading indicator, \playNext\ for sequential playlist navigation, and \stats\ for recording user actions and media events for debugging and profiling.

(repo-wide) · high confidence

New poster plugin with fill modes and native poster support

Added a new poster plugin for xgplayer that allows configuring the video cover image with multiple fill modes (fixWidth, fixHeight, cover, contain) and supports using the video element's native poster attribute. The plugin introduces configuration options such as hideCanplay to control when the poster hides during playback, isEndedShow to display the poster after playback ends, and notHidden to keep it visible. It also provides a setConfig method for runtime updates and handles visibility states via CSS classes and background-image styling.

packages/xgplayer/src/plugins/poster · high confidence

New progress bar plugin with fragment support and mini progress component

The xgplayer progress plugin has been rewritten to support segmented playback via a new \fragments\ configuration, allowing the progress bar to display distinct segments with independent highlighting and focus states. A new \MiniProgress\ plugin has been added for compact progress indicators, and the main progress bar now includes improved handling for drag states, touch events, and visual feedback for cached and played regions.

packages/xgplayer/src/plugins/progress · high confidence

New text track plugin for native and external subtitles

This change introduces a new \texttrack\ plugin for xgplayer, enabling support for both native browser subtitles (via the HTML5 \textTracks\ API) and external subtitle files. The plugin provides a UI control to switch between available subtitle tracks, handles language detection and selection, and includes styling for subtitle rendering (including stroke and background modes) and control bar positioning. It also supports configuration for default subtitle selection, visibility in portrait mode, and i18n labels for the toggle button.

packages/xgplayer/src/plugins/track · high confidence

New utility modules for offline storage, device detection, and debugging

The \packages/xgplayer/src/utils\ directory now includes several new helper modules: \database.js\ provides an IndexedDB wrapper for offline storage capabilities; \sniffer.js\ enhances device and browser detection with support for HarmonyOS and MediaSource Extensions (MSE); \debug.js\ adds a configurable logging system accessible via the player instance; \url.js\ offers a utility for resolving relative URLs; and \xgplayerTimeRange.js\ introduces a helper class for managing buffered time ranges. These utilities support features like offline playback, improved compatibility detection, and enhanced debugging.

packages/xgplayer/src/utils · high confidence

Subtitle demo fixture adds XSS validation and timeline controls

The subtitle fixture now includes a comprehensive demo page with a timeline panel for seeking and a control panel to switch between multiple subtitle tracks (VTT, ASS, JSON, bilingual, Chinese). It introduces a dedicated 'XSS validation' track containing common attack payloads (img onerror, script tags, SVG onload, javascript URLs, unsafe attributes) to verify that the subtitle renderer treats HTML content as inert text rather than executing it, with a status indicator confirming whether any unsafe nodes are detected in the DOM.

fixtures/subtitle · high confidence

Behavioural changes

Ad-specific UI controls for play, progress, and time

The player now uses dedicated UI components (AdPlayIcon, AdProgress, AdTimeIcon) when ads are active, ensuring that the play button, progress bar, and time display reflect ad state and duration rather than the main content. These controls listen to ad-specific events (AD\_PLAY, AD\_PAUSE, AD\_TIME\_UPDATE) and delegate actions to the ad plugin, providing a consistent experience during ad playback.

packages/xgplayer-ads/src/ui/plugins · high confidence

Automated staged formatting on commit

A pre-commit hook has been added to the development workflow to automatically format staged files using the 'yarn format:staged' command, ensuring consistent code style before changes are committed.

.husky · high confidence

Fullscreen plugin refactored with orientation lock and back icon support

The fullscreen plugin has been rewritten to support automatic landscape orientation locking on mobile devices when the video is wider than it is tall (controlled by the new \useScreenOrientation\ and \lockOrientationType\ config options). It also introduces a configurable back button (\needBackIcon\) that appears in the top-left corner during fullscreen mode, and adds a \rotateFullscreen\ option to handle screen rotation events on mobile devices.

packages/xgplayer/src/plugins/fullscreen · high confidence

Initial release of xgplayer v3.0.17-alpha.1 with new default styling and mobile fullscreen improvements

This update introduces xgplayer v3.0.17-alpha.1, featuring a refactored SCSS architecture that splits styles into modular files (common, variable, animation, svg-url) for better maintainability. The default player skin has been updated with new background colors, logo styling, and improved mobile fullscreen rotation handling (90vh control) to resolve control bar height issues. Additionally, CSS fixes address enter-tip display errors in Safari and IE, and the player now supports video fill modes (contain, cover, fill) via data attributes.

packages/xgplayer/src/style · high confidence

Keyboard plugin introduces global event handling and input field awareness

The keyboard plugin now registers keydown listeners on both the player root and the document body, enabling global shortcut key support while preventing event bubbling to avoid conflicts. It also includes logic to detect input elements (INPUT, TEXTAREA, or contentEditable) to ensure keyboard shortcuts do not interfere with user text entry.

packages/xgplayer/src/plugins/keyboard · high confidence

New Transmuxer Service for HLS Buffer Handling

Introduces a new Transmuxer class within the HLS buffer service that manages demuxing and remuxing of video and audio chunks. The implementation supports both MP4 and TS container formats, utilizing FMP4 and TS demuxers from xgplayer-transmuxer. It includes specific logic to address slow first-frame rendering on LG WebOS 6 by adjusting track duration for live streams in low-latency mode. Additionally, the service detects and emits events for large audio/video gaps, discontinuities, and keyframes, while also handling metadata parsing and SEI sample extraction.

packages/xgplayer-hls/src/hls/buffer-service/transmuxer · high confidence

New default player presets with time-segment support and platform-specific configurations

The player now includes new preset configurations (default, default-en, live, mobile) that define which plugins are loaded based on the device and content type. The default preset adds support for time-segment playback via the TimeSegments plugin and includes Chinese localization by default, while the English preset omits localization. The live preset is optimized for live streams by excluding VOD-specific controls like progress bars and downloads, and the mobile preset tailors the interface for touch devices. Platform-specific logic ensures PC and iPad users receive additional features like keyboard navigation and dynamic backgrounds, while mobile users get a simplified control set.

packages/xgplayer/src/presets · high confidence

New manifest loader with low-latency HLS and multi-track support

The manifest loading logic has been replaced with a new implementation that supports Low-Latency HLS (LL-HLS) via the \useLowLatency\ configuration option, allowing users to enable or disable this feature. The loader now concurrently fetches and parses video, audio, and subtitle M3U8 manifests, applying the \manifestLoadTimeout\ setting to all of them. It also supports parsing M3U8 content directly from text via the \parseText\ method and exposes the \onPreM3U8Parse\ hook for pre-processing manifest data before parsing.

packages/xgplayer-hls/src/hls/manifest-loader · high confidence

New segment loader implementation for HLS playback

The HLS module now uses a new SegmentLoader class to handle media segment, initialization segment, and encryption key loading. This change introduces dedicated network loaders for video, audio, and keys, along with caching for map and key data, and emits detailed bandwidth and loading events (speed, TTFB, load complete) to improve playback performance and debugging capabilities.

packages/xgplayer-hls/src/hls/segment-loader · high confidence

New subtitle rendering engine with XSS protection and SRT support

The \xgplayer-subtitles\ package has been replaced with a new implementation that introduces a dedicated safe-inline renderer to prevent XSS vulnerabilities when displaying styled subtitle text. This update adds support for SRT subtitle files alongside existing VTT and ASS formats, and includes a new 'step' render mode for character-by-character subtitle display. The change also brings improved timestamp parsing compatibility and a robust error handling system with specific error codes for better debugging.

packages/xgplayer-subtitles/src · high confidence

Progress preview plugin adds story point (dot) management and fixes seek behavior

The progress preview plugin now supports adding, updating, and deleting 'story points' (dots) on the progress bar via a new \dotsApi\, allowing users to mark specific time ranges with custom text, colors, and styles. This change also fixes a behavioral issue where the progress bar's mouseup event was not firing correctly during preview interactions, ensuring seek operations complete reliably. Additionally, the preview tooltip positioning and dot rendering have been aligned to device pixels to correct visual misalignment on high-DPI displays.

packages/xgplayer/src/plugins/progressPreview · high confidence

Screenshot plugin adds configurable auto-download behavior

The screenshot plugin now includes a \saveImg\ configuration option (defaulting to \true\) that controls whether the captured image is automatically downloaded to the user's device upon capture. This aligns the v3 plugin API with the v2 version, allowing users to disable the automatic download if they prefer to handle the image data manually via the emitted event.

packages/xgplayer/src/plugins/screenShot · high confidence

Video download plugin now supports authenticated requests

The video player's download feature has been updated to support downloading files from URLs that require authentication. The plugin now passes custom headers and credentials (such as cookies) to the download request, allowing users to save protected content. This change also includes improved compatibility for handling blob URLs during the download process.

packages/xgplayer/src/plugins/download · high confidence

Fixes

Add volume control plugin with accurate value display

Introduces the volume plugin for the xgplayer, providing a UI for adjusting playback volume via mouse/touch interactions and displaying the current volume percentage. The implementation includes a fix for floating-point precision issues in the volume label display, ensuring the shown value matches the actual volume level by using Math.round instead of Math.ceil.

packages/xgplayer/src/plugins/volume · medium confidence

Added FLV.js fixture for ES module testing

Added a new fixture in fixtures/flvjs containing an HTML page and an ES module JavaScript file to test the xgplayer-flv.js plugin. The fixture initializes the player with FLV streaming capabilities and logs various playback events and errors to the console and UI, addressing issue \#953 regarding startup failures in ES environments.

fixtures/flvjs · medium confidence

Fixes for HEVC discontinuity handling and timestamp recovery in MPEG-TS transmuxer

The MPEG-TS transmuxer now correctly handles HEVC stream discontinuities by rewriting CRA\_NUT to BLA\_W\_LP when necessary, ensuring Safari and VideoToolbox drop stale decoder references. It also preserves recovered video samples instead of dropping them and removes unverified timestamp recovery logic to prevent incorrect time adjustments. These changes improve playback stability for HEVC content and ensure accurate synchronization during stream breaks.

packages/xgplayer-transmuxer/src/mpeg-ts · high confidence

Improved ad UI management and container visibility

The ad UI logic has been refactored to better manage the visibility of the ad container and UI elements during playback. Specifically, the ad container is now hidden when not playing ads to allow user interaction with the content area, and it is no longer hidden between ads in a pod to reduce switching flicker. Additionally, the start button state is corrected to hide after an ad plays, the replay component is hidden during ads, and the ad container is properly hidden when an ad is skipped or encounters an error. The UI also now supports hiding playback controls during ad playback if configured.

packages/xgplayer-ads/src/ui · high confidence

Introduce new FLV demuxer with AMF parsing and timestamp fixing

The FLV demuxer implementation in \packages/xgplayer-transmuxer/src/flv\ has been replaced with a new version that includes an AMF metadata parser (\amf.js\) and a dedicated timestamp fixer (\fixer.js\). This update adds support for G.711 audio codecs (A-law and mu-law) and Opus, and introduces logic to handle discontinuities, large DTS deltas, and timestamp breaks to prevent playback stalls during live streaming or VOD seeking.

packages/xgplayer-transmuxer/src/flv · high confidence

Introduce structured model classes for audio, video, and metadata tracks

The transmuxer now uses dedicated model classes (AudioTrack, VideoTrack, MetadataTrack) and their corresponding sample types (AudioSample, VideoSample) to represent media data internally. This change provides a structured way to manage track properties, sample timing (PTS/DTS), codec configurations, and encryption metadata, laying the groundwork for improved handling of complex stream scenarios such as HEVC discontinuity recovery.

packages/xgplayer-transmuxer/src/model · medium confidence

New plugin architecture with hook system and ResizeObserver fixes

The plugin system has been rewritten to include a new hook mechanism (via \hooksDescriptor.js\) that allows plugins to intercept and modify behavior, and a dedicated \ResizeObserver\ module to handle container resizing. This update fixes errors that occurred when destroying the player by properly managing observer lifecycle, and ensures that plugin hooks are invoked correctly with the right arguments.

packages/xgplayer/src/plugin · high confidence

Rewrote AirPlay and Chromecast platform integrations in TypeScript with improved handoff reliability

The AirPlay and Chromecast casting logic in \packages/xgplayer-cast/src/platform\ has been migrated from JavaScript to TypeScript and restructured to harden device handoff. For AirPlay, the new implementation preserves the playback resume time when switching between local and remote playback, preventing position loss during route changes. For Chromecast, the integration now includes a dedicated remote controller to sync local player state with the receiver and normalizes media resolution to ensure consistent content delivery. These changes improve the stability and user experience of casting sessions by ensuring smoother transitions and more reliable state synchronization.

packages/xgplayer-cast/src/platform · high confidence

Test coverage

Added HLS.js fixture for testing player behavior; Added snapshot tests for FLV and TS video formats; Added test coverage for MP4 transmuxer components; Added tests for MPD SegmentList parsing and duration conversion; Added tests for MPEG-TS fixer and demuxer logic; Added tests for XSS handling in subtitle rendering; Added tests for plugin hooks and screen orientation fallback; Added unit tests for MP4 parsing and FLV transmuxing; Added unit tests for the HLS BufferService; Added unit tests for transmuxer codec parsers; Added unit tests for transmuxer model classes; Added unit tests for transmuxer utility functions; Added unit tests for xgplayer-cast plugin; Initial test suite for xgplayer-hls plugin; Initial unit test suite for xgplayer-flv.

Dependencies

xgplayer and plugins updated to version 3.0.26

The xgplayer core library and its associated plugins (including xgplayer-ads, xgplayer-cast, xgplayer-dash, xgplayer-flv, xgplayer-hls, xgplayer-mp4, xgplayer-music, xgplayer-shaka, xgplayer-streaming-shared, xgplayer-subtitles, and xgplayer-transmuxer) have been updated to version 3.0.26. This release aligns the monorepo packages and updates internal dependencies such as hls.js and danmu.js to support the latest features and fixes.

(dependencies) · high confidence

Housekeeping

Repository initialization with monorepo tooling and documentation

The repository is initialized with a monorepo structure, including a root \biome.json\ for code formatting and linting, \jest.config.js\ and \jest.setup.js\ for test configuration, and \tsconfig.json\ files for TypeScript strictness checks. Documentation is added via \README.md\, \README.zh-CN.md\, and \AGENTS.md\ (aliased via \CLAUDE.md\), which outlines commands, rules, and navigation for the project. Configuration files like \.gitignore\, \.npmrc\, \.yarnrc\, and \.czrc\ are also established to standardize development workflows.

(repo-wide) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 48 → 48 (-0.1)
  • Rubric changed (rubric-2026.09.12 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 42 → 43 (+0.7)
  • Architecture 87 → 88 (+0.7)
  • Maturity 75 → 73 (-2.0)
  • Readiness 48 → 49 (+1.3)
  • Security 45 → 45 (+0.8)
  • Performance 60 (new)

Resolved (42)

  • Dependency hygiene PARTLY measured — npm pinning read, dependency currency not (no pnpm-resolved versions to grade)
  • Documentation: no architecture or design documentation (README.md)
  • Documentation: no installation or build instructions
  • Documentation: no usage examples (README.md)
  • HEVC.parseHEVCDecoderConfigurationRecord (cognitive 19) (packages/xgplayer-transmuxer/src/codec/hevc.js)
  • High CVE: [GHSA redacted] (yarn.lock)
  • High CVE: [GHSA redacted] (yarn.lock)
  • Hotspot: packages/xgplayer-dash/src/m4s/mpd.js (packages/xgplayer-dash/src/m4s/mpd.js)
  • Hotspot: packages/xgplayer-hls/src/hls/buffer-service/index.js (packages/xgplayer-hls/src/hls/buffer-service/index.js)
  • Hotspot: packages/xgplayer-mp4-loader/src/loader.js (packages/xgplayer-mp4-loader/src/loader.js)
  • Hotspot: packages/xgplayer-mp4-loader/src/utils.js (packages/xgplayer-mp4-loader/src/utils.js)
  • Hotspot: packages/xgplayer-mp4/src/mp4Plugin.js (packages/xgplayer-mp4/src/mp4Plugin.js)
  • Hotspot: packages/xgplayer-streaming-shared/src/net/xhr.js (packages/xgplayer-streaming-shared/src/net/xhr.js)
  • Hotspot: packages/xgplayer-subtitles/src/index.js (packages/xgplayer-subtitles/src/index.js)
  • Hotspot: packages/xgplayer-subtitles/src/parser.js (packages/xgplayer-subtitles/src/parser.js)
  • Hotspot: packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js (packages/xgplayer-transmuxer/src/mp4/mp4-demuxer.js)
  • Hotspot: packages/xgplayer-transmuxer/src/mp4/mp4-parser.js (packages/xgplayer-transmuxer/src/mp4/mp4-parser.js)
  • Hotspot: packages/xgplayer/src/mediaProxy.js (packages/xgplayer/src/mediaProxy.js)
  • Hotspot: packages/xgplayer/src/utils/util.js (packages/xgplayer/src/utils/util.js)
  • Off-boarding risk: anonymized user #1
  • …and 22 more

New (42)

  • Concentrated knowledge decay
  • Documentation: no project overview (README.md)
  • HEVC.parseHEVCDecoderConfigurationRecord (cognitive 19) (packages/xgplayer-transmuxer/src/codec/hevc.ts)
  • HEVC.parseSliceHeader (cognitive 24) (packages/xgplayer-transmuxer/src/codec/hevc.ts)
  • HEVC.parseSliceHeader (cyclomatic 46) (packages/xgplayer-transmuxer/src/codec/hevc.ts)
  • High CVE: [GHSA redacted] (yarn.lock)
  • High CVE: [GHSA redacted] (yarn.lock)
  • Hotspot: fixtures/hls/index.js (fixtures/hls/index.js)
  • Hotspot: packages/xgplayer-cast/src/platform/chromecast.ts (packages/xgplayer-cast/src/platform/chromecast.ts)
  • Low cohesion: ScreenShot (LCOM4 5) (packages/xgplayer/src/plugins/screenShot/index.js)
  • Medium: security finding (details withheld)
  • MethodTooLong: TsDemuxer.demux (packages/xgplayer-transmuxer/src/mpeg-ts/index.ts)
  • NALu.parseAnnexB (cognitive 32) (packages/xgplayer-transmuxer/src/codec/nalu.ts)
  • NALu.parseAnnexB (cyclomatic 22) (packages/xgplayer-transmuxer/src/codec/nalu.ts)
  • Off the main sequence: xgplayer-transmuxer
  • Off-boarding risk: anonymized user #1
  • Outdated (npm): @babel/runtime
  • Outdated (npm): concat-typed-array
  • Outdated (npm): crypto-es
  • Outdated (npm): deepmerge
  • …and 22 more

Changes since last survey

  • 11 commits — 3 feature/other, 8 fixes

By area

  • packages/xgplayer-transmuxer — 4 commits
  • packages/xgplayer — 3 commits
  • fixtures/hls — 1 commit
  • packages/xgplayer-cast — 1 commit
  • packages/xgplayer-dash — 1 commit
  • packages/xgplayer-music — 1 commit

Notable commits

  • fix: fix(dash): parse MPD durations with any combination of H, M and S
  • fix: fix(hls): avoid unsafe HTML rendering in fixture
  • fix: fix(transmuxer): keep recovered video samples
  • fix: fix(transmuxer): recover HEVC discontinuity boundaries
  • fix: fix(xgplayer): align progress preview to device pixels
  • fix: fix(xgplayer): guard missing screen orientation
  • fix: fix(xgplayer-transmuxer): harden ExpGolomb boundary reads
  • fix: revert(transmuxer): drop unverified timestamp recovery
  • change: docs(xgplayer): explain device pixel alignment
  • change: docs(xgplayer-music): fix 404 link to the config documentation
  • change: refactor(monorepo): enforce strict TypeScript checks

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

bytedance/xgplayer was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 2 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 65b6a0ec223e3a92d55c4453df419197806967d4 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.