hls.js was created by Guillaume du Pontavice in 2015 to bring HLS playback to browsers that don't natively support it — historically every desktop browser except Safari. It parses m3u8 playlists, fetches segments, runs ABR, manages MSE source buffers, and integrates with EME for DRM. The library is mature, well-documented, MIT-extensively-tested, and shipped as part of many commercial player products. By 2026 it is the de-facto open HLS player.
hls.js handles classic HLS, LL-HLS (since 1.1, 2022), fMP4 segments (since 0.13, 2018), live and VOD, multi-audio and subtitle tracks, content steering (since 1.4, 2023), and Widevine/PlayReady DRM via EME. The ABR is throughput-based with buffer-level safety constraints; ABR behaviour is configurable through dozens of parameters. The library size is around 80 KB minified+gzipped — small enough for any web video page.
Production patterns: hls.js as the default for desktop and Android browsers, Safari's native HLS support for iOS. Some operators always use hls.js even on Safari for behavioural consistency (Safari's native HLS does some things differently). hls.js is also the embedded player in Twitch's web app, Cloudflare Stream's default player, and many smaller services. The maintainer team is active, with multiple releases per year and a stable API.

