v10.0.0-rc.5
Released 2026-10-01. Contains breaking changes.
This is the last round of API cleanup before 10.0: the Minimal skin becomes Neutral, the player store adopts media element names, and a new Compat skin joins wider browser support.
Breaking changes
If you use the Default skin with no custom UI and no hand-wired extensions, there’s nothing to change. Otherwise, start with the first two.
Likely to affect you
-
Minimal is now Neutral (#3092). This affects anyone on the Minimal skin, however you installed it. Rename every
minimaltoneutral: import paths,Minimal*Skincomponents,<*-minimal-skin>elements,data-theme,family="minimal"icons, CDN*-minimal.*files, Shadcnr/*/minimalpaths, and--skin minimal. There are no aliases. Old import paths fail at build time, but some failures are quiet: an old CDN URL returns 404, and CSS that targetsdata-theme="minimal"stops matching. See Customize skins. -
The player store uses media element names (#3012). This affects custom UI that reads state or calls actions on the store. Toggles split into explicit pairs, and state fields take the
HTMLMediaElementnames. TypeScript flags each rename. In plain JavaScript, an old field reads asundefinedwithout an error, and an old action throws when called.toggleSubtitles()andtoggleControls()stay, and hotkey and gesture action names such astogglePausedare unchanged.canPlaynow turns true atHAVE_FUTURE_DATA, andrequestPictureInPicture()rejects before metadata loads. See the player store reference.
Only if you use these APIs
- Thumbnail and subtitle state (#3057). Custom thumbnail or captions UI: read
thumbnailsTrack({ cues, src, crossOrigin }ornull) instead ofthumbnailCues,thumbnailTrackSrc, andthumbnailTrackCrossOrigin. CallselectSubtitlesTrack(null)instead of passing'off'. - Hand-wired extensions (#2880). Mounted
<google-cast>,<mux-data>,<GoogleCast>, and<MuxData>need no change. If you calleduseMediaExtension,addMediaExtension, or an extension’ssetAdapter(), render the element or component inside the player instead. - Tailwind skin source (#3094). If you added skin source to your project, rename the
media-opaquevariant tomedia-high-contrast. Its behavior is unchanged. - Exhaustive
IndicatorStatusswitches (#3064).IndicatorStatusnow accepts custom strings, so aswitchthat covers every status needs adefaultcase. UseBuiltInIndicatorStatusfor the built-in names only.
Skins and browser support
The new Compat skin offers a simpler control layout with conservative CSS for video, live video, audio, and live audio. It ships in the HTML and React packages, CDN bundles, Shadcn registries, and installation tools (#3026).
Packaged skins now support Chrome and Edge 111, Firefox 121, and Safari and iOS 16.4. Their bundles flatten @scope rules and include CSS fallbacks, while editable registry CSS keeps @scope for readability (#2966, #2951). See browser support for details.
We also restored the closing transition on nested menus and lowered the default skin’s backdrop saturation so controls read more clearly (#3025, #3091).
Media and playback
resolveAdapterType() and resolveMimeType() pick the right media component from a URL or MIME type, using the same rules as the installation flow. They handle service URLs, streams, and files, recognize youtube/<id> and vimeo/<id> shorthands, and return null for ambiguous bare IDs (#3024).
Google Cast and Mux Data now attach at the player, so they work with a plain <video> or <audio> and follow media changes. A refused play or AirPlay request no longer surfaces as an unhandled rejection (#2880). Native HLS honors a stream’s SERVER-CONTROL hold-back when it finds the live edge, and hls.js keeps captions when media attaches after the manifest loads (#3027, #3099).
React and custom UI
- React Server Components can now call
@videojs/reacthelpers such asmergePropsand read its constants. Each component and hook module declares its own client boundary, instead of the package barrels marking every export as client-only (#3079). - React media components accept
mediaRef. On native media it receives the element; on iframe embeds such as YouTube and Vimeo it receives the playback adapter, so you can callplay()withoutuseMedia().refstill points to the rendered element (#3098). - The status indicator can show feedback for your own hotkey actions through
deriveCustomStatus(#3064). - Core, HTML, and React each export a
VERSIONconstant for diagnostics (#3078).
Documentation
The new Vidstack migration guide maps providers to Video.js media components (#3021). The player store reference lists every state field and action, generated from source, and the migration and playback guides now use current APIs with complete examples and agent-ready migration prompts (#3034, #3074, #3075, #3076).