Your browser's audio, under your control.
Boost volume beyond 100%, shape sound with a 5-band EQ, tame loud ads with a compressor — and do it automatically, per site, without touching a slider twice.
Audio Engine sits quietly in your browser. Set a rule once — *.youtube.com → 150% — and it applies every time you visit. No popup required. No babysitting.
- Volume 0–1000% with smooth ramping (no pops, no clipping)
- 5-band EQ — 60 Hz · 250 Hz · 1 kHz · 4 kHz · 12 kHz, ±12 dB each
- Dynamic Range Compression — loud ads quieter, quiet dialogue louder
- Mono mix — fold stereo to mono with one toggle
- Rule engine — domain-based rules, exact match > subdomain > wildcard, auto-applied
- Auto-wake — rules fire when you open a tab, no popup needed
- Live VU meter — pulsing badge and level bar in the popup while audio plays
| Browser | Version | Status |
|---|---|---|
| Chrome | 116+ | Full — tabCapture + offscreen, works on every site including Netflix, TikTok |
| Edge / Brave | 116+ | Full — same as Chrome |
| Firefox | 140+ | Full on most sites — Web Audio engine, DRM content plays normally without boost |
| LibreWolf | 140+ | Full — same as Firefox, see install note below |
A Chrome Web Store listing is coming. Until then, load it as an unpacked extension.
- Go to the Releases page and download
audio-engine-chrome.zip - Unzip the file anywhere
- Open
chrome://extensions→ enable Developer mode (toggle, top right) - Click Load unpacked → select the unzipped folder
- Pin the extension icon to your toolbar
Done. The extension survives browser restarts.
A Firefox Add-ons (AMO) listing is coming. Until then, install the
.xpidirectly.
- Go to the Releases page and download
audio-engine-firefox.xpi - Open
about:addons→ click the ⚙️ gear icon → Install Add-on From File - Select the
.xpi→ confirm the install
The extension stays installed across restarts.
LibreWolf requires one extra step (Firefox doesn't):
- Go to
about:config→ search forxpinstall.signatures.required→ set tofalse - Then follow the Firefox steps above
You only need to do this once.
- Visit a site with audio — YouTube, Spotify, a podcast, anything
- Click the Audio Engine icon in your toolbar
- Move the volume slider — audio responds instantly
- Hit Save Rule to lock in the setting for this domain
- Done — next time you open that site, it applies automatically
The power button toggles capture for the current tab. The EQ and DRC panels are in the same popup. Options (rule manager, groups, theme) are in the dedicated settings page via the gear icon.
| Situation | Chrome | Firefox |
|---|---|---|
| DRM content (Netflix, Disney+, Spotify) | Works | Video plays normally, boost not applied |
| Cross-origin media without CORS headers | Works | Audio plays normally, boost not applied |
chrome:// and extension pages |
No | No |
| Ads inside iframes | No | No |
Firefox's limitations are architectural — tabCapture was never implemented in Firefox, so the engine hooks directly into <video>/<audio> elements on the page instead. DRM-locked streams can't be touched this way without silencing them permanently, so they're intentionally skipped.
# Clone
git clone https://github.com/huseyincancalti/Audio-Engine.git
cd Audio-Engine
# Chrome build
npm install
npm run build # → dist/
npm run typecheck # optional, type check only
# Firefox build
cd audio-engine-firefox
npm install
npm run build # → audio-engine-firefox/dist/Load in Chrome: chrome://extensions → Developer mode → Load unpacked → select dist/
Load in Firefox: about:debugging → This Firefox → Load Temporary Add-on → select audio-engine-firefox/dist/manifest.json
┌──────────┐ ENABLE/DISABLE ┌────────────┐ START_CAPTURE ┌────────────────────┐
│ Popup │ ─────────────────► │ Background │ ───────────────► │ Offscreen Document │
│ (React) │ UPDATE/STATUS │ (worker) │ UPDATE_SETTINGS │ (Web Audio engine) │
└──────────┘ └────────────┘ └────────────────────┘
│ │
│ getMediaStreamId(tabId) │ tabCapture stream
└──────────────────────────────────► │ → EQ → Gain → DRC
│ → Analyser → dest
- Background service worker: orchestrates tab capture, resolves rules, manages offscreen lifetime
- Offscreen document: one per active capture; processes audio via Web Audio API; returns VU levels
- Content scripts: fullscreen sync (MAIN world intercept + ISOLATED world bridge)
- Popup: thin view; reads state from background, writes commands back
Audio chain (per tab):
tabCapture stream → BiquadFilter ×5 (EQ) → GainNode (0–10×) → [ChannelSplitter/Merger (mono?)]
→ DynamicsCompressor → AnalyserNode (VU) → destination
┌──────────┐ START_CAPTURE ┌────────────┐ sendMessage ┌──────────────────────┐
│ Popup │ ───────────────► │ Background │ ────────────► │ Content Script │
│ (React) │ UPDATE/STOP │ (persistent│ │ (audio engine lives │
└──────────┘ │ bg page) │ │ here, per tab) │
└────────────┘ └──────────────────────┘
- Background page (persistent, never sleeps): orchestrates, resolves rules, pings content scripts
- Content script: runs the full Web Audio engine inside the page; hooks
<video>/<audio>elements
Audio chain:
<video>/<audio> element → createMediaElementSource (or MediaStreamSource for WebRTC)
→ BiquadFilter ×5 (EQ) → GainNode → [mono?] → DynamicsCompressor → AnalyserNode → destination
Guards:
- DRM guard — elements with
mediaKeysset (Netflix EME) are skipped; hooking them would silence them permanently - CORS taint guard — cross-origin elements without CORS headers are skipped for the same reason
- Neutral passthrough — "stop" sets gain to 1.0, EQ to 0 dB, DRC to transparent; the Web Audio graph stays wired but audio passes through unchanged
Priority (highest → lowest):
1. One-off override (user moved slider manually, not saved)
2. Exact match music.youtube.com
3. Subdomain match *.youtube.com
4. Wide wildcard *.com / group pattern
5. Global default
Tie-breaking: score = len(literal chars) − (wildcard count × 10), higher wins
Most volume extensions either boost the entire OS (affecting everything) or cap out at 200%. Audio Engine works at the tab level — isolated, per site, with the audio chain you'd expect from a DAW, not a toy slider. The rule engine means you set it once and forget it.
The Firefox port was built because tabCapture was never implemented in Firefox (Bugzilla #1391223, open since 2017). Rather than give up, the engine was redesigned from scratch for that constraint.
Made with strong coffee by karakedidub