# What changed in wavesurfer.js

> 18 changes in wavesurfer.js 8 from its official release notes, upgrade guides and advisories: 3 new APIs and options. Each one cited. Sources checked 2026-10-28. HTML: https://unstale.sh/npm/wavesurfer.js/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## wavesurfer.js 8

### New APIs and options

- Regions can opt out of label stacking with avoidOverlapping. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- The Spectrogram plugin adds setOptions to change options without re-creating the plugin. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- Adds the Praat-style dynamic compression option to Spectrogram. (8.0.1) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.1)

### Performance

- Region visibility is checked in one pass per scroll, zoom or resize. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- Timeline notches are measured in a single layout pass instead of one pass per notch. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)

### Behavior and default changes

- The renderer views the audio under each canvas instead of copying it. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- A top timeline gets its own space above the waveform. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- Reverts the default mediaRecorderTimeslice value to undefined. (8.0.1) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.1)

### Fixes and other changes

- Auto-center smoothing stays up with the cursor when updates are slower than 60 a second. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- An explicit noverlap value of 0 is honored as no overlap. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- Labels of regions scrolled into view are stacked in one pass. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- One consistent scroll event is emitted per scroll. (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- Windowed segments are recomputed once zoomed more than 2… (8.0.3) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.3)
- Digital silence is judged before pre-emphasis when calculating autoGain. (8.0.2) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.2)
- The continuous waveform is aligned with elapsed time. (8.0.2) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.2)
- Drawing and dragging remain stable when zoomed. (8.0.2) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.2)
- Fetching falls back to arrayBuffer() when response.blob() fails. (8.0.2) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.2)
- The waveform continuously auto-scrolls while the playhead is dragged near the container edge. (8.0.2) — [release notes](https://github.com/katspaugh/wavesurfer.js/releases/tag/8.0.2)
