# Video.js 8.24: the CDN, the tag, and package.json name three versions

> Video.js is an Apache 2.0 open source HTML5 video player with a plugin ecosystem, a TSC-governed contribution process, and a body of adoption that goes back to May 2010. The mechanics are simpler than the reach: a video element with a data-setup attribute, a videojs function for manual setup, and a package that ships CommonJS, ES module, and TypeScript entry points while expecting you to add the stylesheet yourself. The version numbers on the front page are the part to check first.

**videojs/video.js** — GitHub describes it as Video.js - open source HTML5 video player. The repository metadata lists JavaScript as its primary language. The metadata lists the NOASSERTION license. This article stays within the project description and details documented in the GitHub repository README.

- Repository: https://github.com/videojs/video.js
- Website: https://videojs.com
- Stars: 39,901 · Forks: 7,479
- Language: JavaScript
- License: NOASSERTION
- Published: 2026-08-13 · Updated: 2026-08-18 · Language: en
- Canonical page: https://hysenlabs.com/projects/videojs-video-js

## The CDN snippet, the release tag, and package.json name three things

Follow the numbers on the front page and they do not line up. The quick start snippet pulls version 8.24.1 from the CDN:

```html
<link href="//vjs.zencdn.net/8.24.1/video-js.min.css" rel="stylesheet">
<script src="//vjs.zencdn.net/8.24.1/video.min.js"></script>
```

The most recent GitHub release is v8.24.0, dated 2026-08-03, after v8.23.9 from 2026-06-26 and v8.23.6 from 2025-11-14. The package manifest says version 8.24.1. The unpkg and CDNjs examples also use 8.24.1.

Consequence for you: the CDN path, the tag, and the npm package are three separate release surfaces that can be at different points in time, and a patch that matters to you may reach one of them first. Pin whichever channel you use by exact version, and check the changelog for that number rather than assuming the newest tag is what the CDN is serving.

## The Video.js 10 notice is still sitting on the front page

The first line of the README is an update notice: big changes are coming in Video.js 10, early 2026, with a link to a discussion thread. The project is not archived and the last push was 2026-09-16, so the work is not stalled, but the promise on the page and the shipped line are different things. The stable releases in the recent list are all 8.x, with 8.24.0 the newest.

Consequence for you: a team starting a new integration has two questions the front page cannot answer, which is whether 8.x is still the line to build on and what 10 changes. Both answers live in that discussion thread rather than in a changelog entry, and the migration work, if it comes, is not described anywhere in the repository. Decide early whether to standardise on 8.x and treat 10 as a later migration, rather than discovering the change in a breaking release.

## data-setup is JSON, and a malformed value stops setup quietly

Using Video.js is described as creating a video element with one additional attribute. At a minimum data-setup must have a value of empty braces, and it can carry any of the Video.js options, with the explicit warning that it has to be valid JSON. The element in the example carries an id, the video-js class, controls, preload auto, a poster, three source elements for mp4, webm, and ogg, and a paragraph with the vjs-no-js class for browsers without JavaScript.

Consequence for you: that attribute is the configuration surface and it is parsed as JSON, so a server-side template that interpolates a value into it can emit something that is not valid JSON, and the documented failure mode is that no player is set up rather than an exception you can catch. If your configuration is generated, validate the JSON before it reaches the attribute, and keep the no-js paragraph, because it is the only thing a reader without JavaScript ever sees.

## Automatic setup replaces the element, and the manual call is the escape hatch

When the page loads, Video.js finds the marked element and automatically sets up a player in its place. If you do not want that, you leave the data-setup attribute off and initialise the element yourself:

```js
var player = videojs('my-player');
```

The same function also takes an options object and a callback that runs when the player is ready. In that callback this is the player Video.js created, which is how the example calls this.play() and then registers a listener with this.on('ended', ...).

Consequence for you: automatic setup depends on the element already existing when the script runs, so a player injected after load will not be picked up and needs the manual call. Because setup happens in place of the original markup, anything you query against that markup afterwards has to account for the replacement. In the callback, this is the player only if you used a function expression, since an arrow function has no this of its own.

## Three entry points, and the stylesheet is not one of them

The package manifest publishes four paths. main points at a CommonJS bundle, module points at an ES module bundle, style points at a stylesheet, and types points at generated declaration files under the dist types directory. The build copies fonts in from a separate font package, and the stylesheet is produced by its own sass step with load paths for the project root and node_modules.

Consequence for you: consuming this as a component means importing JavaScript and CSS as two separate things, and the font is a third copy step, so a bundler setup that only handles JavaScript will render an unstyled player. The generated type declarations also mean the types you see in an editor come from a build step rather than from hand-written sources, which matters when a release changes the public API surface.

## The build proves a bundler can consume the output

Two of the test build steps are about other people's tools. One bundles a browserify entry from the test directory and writes the result, another runs webpack in development mode against a webpack entry in the same place, and a third copies an accessibility example file into place. The development start script runs a watcher alongside a karma server, so the suite runs in a browser. There is also a composer.json at the top level, so the project is packaged for the PHP toolchain as well as for npm and the CDN.

Consequence for you: the project treats Browserify and webpack consumption as part of its own surface, so a bundler incompatibility is something its build is designed to catch rather than something you discover in production. The cost of that choice is that both bundlers stay in the supported set. The composer manifest is the quiet one, since a JavaScript-only dependency review will not see that channel at all.

## The trademark and the stewardship sit with different companies

Video.js is licensed under the Apache License, Version 2.0, and the name Video.js is a registered trademark of Brightcove, Inc. Oversight runs through a Video.js Technical Steering Committee, and the Corporate Shepherd role has changed hands over time: Zencoder from 2010 to 2012, Brightcove from 2013 to 2025, and Mux from 2025 onward. No contributor license agreement has ever been required, and contributions are made under a Developer's Certificate of Origin 1.1. Compatibility testing runs on BrowserStack, the free CDN copy is sponsored by Fastly, and the website is hosted by Netlify.

Consequence for you: the Apache licence covers the code and the trademark does not, so a fork, a rebrand, or a white label product cannot use the name, and that is a different question from whether you may modify the source. The governance and contribution documents sit in a separate admin repository rather than in this one, so anyone auditing how decisions get made has to look outside the project they depend on.

## The generated language files and API docs are cleaned on every build

Two build details say how much of this repository is output rather than source. The clean step removes the dist directory, the test dist directory, the generated API directory under docs, and the Chinese language JSON files, and a post-clean step recreates the dist directories. The build itself runs the development build, then minification, then the copy steps, then a zip, and the development build runs clean, an errors-only lint, and the JavaScript, CSS, language, test, and type steps in order.

Consequence for you: those language files and API pages are regenerated from source on every build, so a change to a string is not visible until the build runs, and a clean checkout has no compiled output at all. It also means the clean step is destructive by design, so a script that runs it against a working tree with local changes in those directories will remove them without asking.

## Conclusion

Video.js fits a team that wants one player across desktop, mobile, tablet, and web-based Smart TVs, that wants HLS and DASH behind a common API rather than a separate library, and that is willing to treat the data-setup attribute as the single point of configuration. It does not fit someone who needs a trademark they can rename, because the name is a registered trademark of Brightcove, and it does not fit a team that wants governance documents in the repository, since the steering committee and contribution rules live in a separate admin repository. Before you pin a version, check which of the three numbers on the front page you are actually installing, and read the Video.js 10 discussion before committing a new integration to the 8.x line.

## FAQ

### Does video.js support HLS?

Yes. The README states that out of the box Video.js supports all common media formats used on the web, including streaming formats like HLS and DASH, and the package description calls it an HTML5 video player that supports HLS and DASH with a common API and skin. It works on desktops, mobile devices, tablets, and web-based Smart TVs.

### what is video js

Video.js is a full featured, open source video player for all web-based platforms, started in May 2010 and licensed under the Apache License, Version 2.0. It can be extended and customized by an ecosystem of plugins, and the name Video.js is a registered trademark of Brightcove, Inc.

### how to install video js

The quickest route is the free CDN hosted copy sponsored by Fastly, where you add a stylesheet link and a script tag to the head of your document, pinned to a version such as 8.24.1 on vjs.zencdn.net. Alternatively you can install it from npm, download it from GitHub releases, or include it via unpkg or another JavaScript CDN such as CDNjs.

### how to use video js in html

Create a video element with the video-js class, controls, a preload setting, a poster, source elements, and a data-setup attribute whose minimum value is an empty JSON object. Video.js finds the element when the page loads and sets up a player in its place, or you can leave data-setup off and call the videojs function yourself with the element id, optionally passing an options object and a ready callback.

### how to use video js in react

The README does not cover React. What it documents is the plain HTML path, a video element carrying data-setup, and manual initialisation through the videojs function, which accepts an options object and a callback invoked when the player is ready, inside which this is the player that Video.js created.

### video js vs html5

The repository does not make that comparison. What it states is that using Video.js is as simple as creating a video element with an additional data-setup attribute, and that the player handles the common media formats including HLS and DASH, runs on web-based Smart TVs as well as desktops and mobile, and can be extended through plugins.

## Sources

- [Official documentation](https://videojs.com)
- [Official README](https://github.com/videojs/video.js#readme)
- [Project repository](https://github.com/videojs/video.js)
- [Release notes](https://github.com/videojs/video.js/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/videojs-video-js
