# Video Speed Controller by igrigorik: a Chrome extension for HTML5 playback rate

> Video Speed Controller gives fine-grained speed control over any HTML5 video or audio element, with per-site rules and remappable shortcuts. It is a browser extension, so it does nothing outside Chrome and nothing on a phone.

**igrigorik/videospeed** — HTML5 video speed controller (for Google Chrome)

- Repository: https://github.com/igrigorik/videospeed
- Website: https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk
- Stars: 4,442 · Forks: 715
- Language: JavaScript
- License: MIT
- Published: 2026-09-23 · Updated: 2026-09-23 · Language: en
- Canonical page: https://hysenlabs.com/projects/igrigorik-videospeed

## The problem: players cap playback rate, and you do not watch at one pace

HTML5 media elements expose a native playback rate API. The README's argument is that most players hide it or artificially limit it, so the control exists in the platform but not in the interface you are given. Video Speed Controller is a Chrome extension that puts that control back, on any site with an HTML5 video or audio element: YouTube, Netflix, Coursera, podcasts, local files.

The README frames the case in terms of reading speed. The average adult reads at 250 to 300 words per minute, speech averages around 150 wpm, and slide presentations often sit closer to 100 wpm. The extension's own summary of the research is that viewers tend to speed up to roughly 1.3x to 1.5x to close that gap, and that with practice many settle at 2x or above. Treat those numbers as the project's stated motivation rather than as measured results from this codebase.

The audience is narrow and specific: people who watch a lot of long-form HTML5 video in desktop Chrome and want the speed control to be a keystroke, not a menu. If you watch one video a week, the extension is overhead.

## How the extension works: an overlay, a shortcut layer, and per-site rules

The mechanism is a content script injected into pages, a draggable overlay drawn on top of the video, and a settings page that owns the key bindings. The overlay shows the current speed; you can reposition it, and the README says the controller CSS is customizable if you want to restyle or move it further.

The default bindings are single keys. S decreases playback speed, D increases it, R resets to 1.0x, Z rewinds 10 seconds, X advances 10 seconds, G toggles between the current speed and a preferred speed, V shows or hides the controller, M sets a marker at the current position, and J jumps back to the previously set marker. Every one of these is remappable, and the settings page accepts modifier combinations with Ctrl, Shift and Alt as well as additional preferred-speed toggles created through an Add New control. The README notes that you should refresh the page after changing bindings for them to take effect, which tells you the bindings are read at page load rather than live.

Speed range is 0.07x to 16x in configurable increments. Two features carry most of the daily value. Per-site speed rules let you set a default for a domain, so a lecture site can always open at 2x. Speed fightback re-applies your chosen speed when a site's player tries to reset it, which is the feature that decides whether the extension works on players that reassert their own rate. Remember speed optionally persists the last speed across sessions and tabs, and per-site disable turns the controller off where you do not want it.

The repository layout backs this up: src/, tests/ split into unit, integration and e2e, specs/, and a manifest.json at the top level. The build is esbuild-driven through scripts/build.mjs, and tests run on vitest with jsdom and puppeteer. That is a normal extension toolchain, not a framework.

## Installing Video Speed Controller and setting it up for one site

The README's install instruction is a single line: install from the Chrome Web Store. There is no build-from-source instruction in the README itself, so the store listing is the documented path for users. The extension ID in the store link is nffaoalbilbmmfgbnbgppjihopabppdk, and the homepage field points at the same listing.

Once installed, open a page with an HTML5 video and press D a few times. The overlay should appear and the number should climb by the configured increment. Press R to return to 1.0x.

The first real configuration step is a per-site rule. Open the extension's settings page, find the per-site section, and add the domain you watch most with the speed you want it to open at. The README gives lecture sites at 2x as the example.

If you want to build the extension from the repository instead of installing the store build, package.json defines the scripts, and the Node engine constraint is explicit:

```json
"engines": {
  "node": "^22.22.2 || ^24.15.0 || >=26.0.0"
}
```

With a matching Node version, the build and test entry points are:

```bash
npm install
npm run build
npm test
```

npm run build runs node scripts/build.mjs, and npm test runs vitest. A watch mode exists as npm run dev. The README does not document loading the built output as an unpacked extension, so if you go that route, check docs/ in the repository rather than expecting the README to walk you through it.

## Where it stops working: Chrome only, HTML5 only, and shortcut collisions

The most concrete limitation is the platform. The repository describes an HTML5 video speed controller for Google Chrome, and the install path is the Chrome Web Store. Nothing in the README describes a Firefox build, a Safari build, an Android build or an iOS build, and the extension depends on a content script and an overlay drawn over a page, which is not a model that transfers to a phone browser. If your viewing is on a phone or on an iPad, this project is the wrong tool, and no setting inside it changes that.

The second boundary is the media element. The extension controls HTML5 video and audio elements. The README's feature list is written around that, and the default shortcuts include rewind and advance by 10 seconds, which are element-level operations. Anything that is not an HTML5 media element is outside the mechanism.

The third is key collisions. Single-letter bindings on every page will conflict with site shortcuts, and the extension does not remove that problem; it lets you remap around it, which is work you have to do. The README also says you must refresh the page after changing bindings, so a remap mid-session will appear to do nothing until you reload. That is a small thing that reads as a bug the first time you hit it.

Finally, speed fightback is a re-application strategy, not a guarantee. The README presents it as automatic re-application when a site's player tries to reset your speed. It is the feature most likely to behave differently from site to site, and it is the one to test on your own sites before trusting it.

## Alternatives and how they differ in approach

The obvious alternative is the player's own speed control. YouTube, for example, ships a playback speed menu. The difference is scope and granularity: a built-in menu is one site, a handful of preset steps, and a mouse interaction. Video Speed Controller is every site with an HTML5 element, 0.07x to 16x in configurable increments, and a keystroke. If the built-in menu already covers your range and you do not mind clicking, the extension adds nothing.

The second alternative is a userscript manager with a small script to set playbackRate. That is a different trade-off: you get a script you can read and edit, and you take on maintaining it against every site that changes its player. Video Speed Controller ships per-site rules, per-site disable, remember speed, fightback and a settings UI, which is more surface than a one-line script but also more to configure.

The third is a general keyboard-shortcut extension that sends the same keys. It does not know about playback rate, so it cannot re-apply a speed that a player resets, and it cannot remember a per-domain default. That distinction is the reason this project exists as a separate extension.

## Maintenance, licence and upgrade cost

The repository is not archived, and the last push was on 2026-09-21, two days before this writing. Recent releases are v0.11.1 on 2026-08-15, v0.11.0 on 2026-08-01, and v0.10.2 on 2026-04-15. That is a cadence of small releases rather than long gaps, and the version in package.json matches the latest release, 0.11.1.

For a user, the upgrade cost is close to zero. The store build updates itself, and the README does not describe a settings migration step between these releases. The one recurring cost is the refresh-after-remap rule: if you change bindings, reload the page.

For someone building from source, the cost is the toolchain. package.json pins Node to ^22.22.2 || ^24.15.0 || >=26.0.0 and carries a dev dependency set that includes esbuild, vitest, puppeteer, eslint, prettier and husky. There is a prerelease script that chains clean, lint, test and test:tlc, so the project's own definition of a release candidate is lint plus unit and integration tests plus a type-level check. Running a build on an older Node will fail on the engines constraint before it fails on anything interesting.

The licence is MIT, copyright 2014 Ilya Grigorik. MIT permits reuse and redistribution with the licence and copyright notice retained; it also means there is no warranty. The repository also contains a PRIVACY.md at the top level, which is worth reading if you care about what an extension that runs on every page can see. The README itself does not describe data handling.

## Conclusion

Adopt it if you watch long HTML5 video in desktop Chrome and want speed changes bound to keys rather than a player menu. Do not adopt it if your viewing happens in Firefox, on Android or iOS, or on media that is not an HTML5 video or audio element, because the project documents a Chrome extension only. Before relying on it, verify the three settings that decide whether it feels invisible or annoying: the increment value, the remember-speed toggle, and the per-site disable list. The first thing to test is the speed fightback behaviour on the site you watch most, since that is the feature the README advertises and the one most likely to behave differently from site to site.

## FAQ

### How do I install Video Speed Controller?

The README's install instruction is to install from the Chrome Web Store, and the homepage field points at the same listing. There is no build-from-source install walkthrough in the README.

### How do I use the Video Speed Controller extension?

Press S to decrease speed, D to increase it, R to reset to 1.0x, G to toggle between the current and preferred speed, and V to show or hide the controller. Every binding can be remapped in the settings page, and you should refresh the page after changing them.

### Is Video Speed Controller free?

The project is MIT licensed and distributed through the Chrome Web Store. The README does not describe any paid tier.

### How do I use Video Speed Controller on YouTube?

The README names YouTube among the sites the extension works on, and the default shortcuts apply there the same way: S and D to change speed, R to reset, G to toggle the preferred speed. Per-site speed rules can set a default for the domain.

### How do I use Video Speed Controller on a phone or iPad?

The material describes a Chrome extension installed from the Chrome Web Store, with no Android or iOS build. On a phone or iPad there is no documented way to run it.

### What is Video Speed Controller?

It is a Chrome extension that gives fine-grained control over any HTML5 video or audio element, from 0.07x to 16x, with per-site rules, per-site disable, remember speed and remappable shortcuts.

## Sources

- [igrigorik/videospeed on GitHub](https://github.com/igrigorik/videospeed)
- [License: MIT](https://github.com/igrigorik/videospeed/blob/master/LICENSE)
- [Project website](https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk)
- [README](https://github.com/igrigorik/videospeed/blob/master/README.md)
- [Releases](https://github.com/igrigorik/videospeed/releases)

---

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