Skip to content
JW Player is the world's most popular embeddable media player.
JavaScript CSS TypeScript HTML
Branch: master
Clone or download
Latest commit c9afd07 Feb 20, 2020


Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Update Sep 16, 2019
assets Remove old font icons Sep 26, 2017
docs v8.12.4 Feb 6, 2020
libs-external Fix playlist error handling after api.load Nov 12, 2015
src Merge pull request #3609 from jwplayer/feature/jw8-10913_ad-warnings Feb 20, 2020
test [JW8-10769] Rename mapPluginToCode to getPluginErrorCode. Feb 11, 2020
.eslintrc Remove no-unsafe-any linting rule Feb 10, 2020
.gitignore Add yarn error log to gitignore Apr 26, 2019
.npmignore Update npmignore file Sep 22, 2017
.project.default default FlashBuilder files May 15, 2014
.stylelintrc Add custom element to stylelintrc Sep 19, 2018
.travis.yml Fix node version used by travis Nov 5, 2019 Fixed spelling in contributing guidelines Apr 23, 2019
Gruntfile.js Move scripts from grunt to package.json Feb 20, 2020
LICENSE Adding our CC license, human-readable version below Jul 1, 2014 Add framework integration table & add micnews react library (#3059) Nov 9, 2018
_config.yml Set theme jekyll-theme-minimal Jul 6, 2017
browserslist [JW8-2319] Update to webpack 4.29 and babel 7 (#3275) Feb 1, 2019
build.version.js [JW8-2319] Update to webpack 4.29 and babel 7 (#3275) Feb 1, 2019
dangerfile.js Add DangerJS (#2736) Feb 22, 2018
jwplayer.license.notice.js Add license banner to JS build output (#2759) Mar 6, 2018
karma.conf.js Cleanup dependencies in package.json May 9, 2019
package.json Remove js check from ts-check Feb 20, 2020
postcss.config.js Add drop shadow variant for idle state JW8-1668 Jul 2, 2018
tsconfig.json Remove noImplicitAny Feb 7, 2020
webpack.config.js Enable tree-shaking and reduce output size by enabling babel loose mo… Feb 12, 2020
yarn.lock Set specific dependency versions and combine ts and js in webpack Jan 29, 2020

JW Player Logo

Plays everywhere, every time.

Live on over 2 million sites with 1.3 billion unique plays per month, JW Player is the solution for seamless video playback across browsers and media types. It empowers the developer to interact with video programmatically to create unique and awesome user experiences.


This is the non-commercial version of JW Player. It does not contain the same features as the commercial-use player available from Commercial use and access to features requires a license. Learn more at If you are a paid customer and want a player, please download it from the "Downloads" section of your JW Dashboard.

Official Documentation

A Simple Example

The example below will render a video player into the div with the player id, listens to an event, and makes a few calls using the API.

<!DOCTYPE html>
    <script src='LINK_TO_YOUR_PLAYER'></script>
    <div id="player">Loading the player...</div>
        // Setup the player
        const player = jwplayer('player').setup({
            file: 'LINK_TO_YOUR_FILE.mp4'

        // Listen to an event
        player.on('pause', (event) => {
            alert('Why did my user pause their video instead of watching it?');

        // Call the API
        const bumpIt = () => {
            const vol = player.getVolume();
            player.setVolume(vol + 10);


We appreciate all contributions towards the player! Before submitting an issue or PR, please see our contributing docs here.

Building the Player

We use grunt and a few npm scripts to build the player, lint code, and run tests. Debug code is built to /bin-debug, while minified & uglified code is built to /bin-release. Code is built with webpack, linted with eslint, and tested with karma, mocha and chai.


  • Node.js with npm
  • yarn is preferred for package management
  • Install global npm dependencies yarn global add eslint grunt-cli jsdoc karma-cli stylelint webpack webpack-cli


  1. Fork the project, clone your fork, and set up the remotes:
# Clone your fork of the repo into the current directory
git clone<your-username>/jwplayer
# Navigate to the newly cloned directory
cd jwplayer
# Assign the original repo to a remote called "upstream"
git remote add upstream
  1. Install the dependencies:
# Install dependencies
yarn global add eslint grunt-cli jsdoc karma-cli stylelint webpack webpack-cli
yarn install
# Optionally, install webpack-dev-server
yarn global add webpack-dev-server
  1. Build the player:
# Build once
# Complete Watch - builds JS, lints, and tests on each change
grunt serve
# Quick JS Watch - build only. Requires webpack-dev-server to be installed globally
webpack-dev-server -w --env.debug --port 8888 --output-public-path /bin-debug/
# Open the test page from another terminal window
open http://localhost:8888/test/manual/
  1. Test your code:
# All browsers
grunt test
# Individual browsers - chrome, firefox, safari
grunt karma:{BROWSER} e.g. grunt karma:chrome
  1. Lint your code:
yarn run lint
  1. Setup git pre-push hook This will add a pre-push script to the project's .git/hooks folder that will lint and run unit tests on the branch before any push.
grunt hooks

Framework Integration

While the JW team does not maintain any framework integrations of our own, there are developers in our community who do. We recommend the following libraries:

Framework Link

If you have a library which you believe is good enough to meet the needs of other developers using a certain framework, please open a pull request modifying the above table.

Software License

The use of this library is governed by a Creative Commons license. You can use, modify, copy, and distribute this edition as long as it’s for non-commercial use, you provide attribution, and share under a similar license.

You can’t perform that action at this time.