Per-tab parametric EQ + bass boost for Chrome, Edge & Opera
11 bands · one global sound · site rules · 100% local
A free and open-source tab equalizer for Chrome, Edge, and Opera.
Boost the bass, fix harsh audio, or make a quiet video louder — and hear the change while you drag.
- Why Umbra EQ
- Install
- Features
- How to use
- Browser support
- Build from source
- How it works
- Privacy
- Stack
- Feedback
- Contributing
- Credits and licenses
Browser audio is take-it-or-leave-it. The bass is thin on your laptop speakers, one video is mixed way too quiet, another has harsh, fatiguing highs — and most EQ extensions either ignore streaming sites or go completely silent on them. Umbra EQ fixes the sound of the tab you are actually listening to, live.
Set your EQ once and it applies to every tab you turn it on for. No per-site fiddling — the global profile is the default everywhere, and you just edit what you hear.
Need one video site brighter and everything else left alone? Add a hostname rule and it overrides the global sound for matching tabs — first match wins — while the rest of the web keeps your global profile.
Not just YouTube. Umbra runs on Netflix, Spotify, and other streaming sites where audio-EQ extensions often produce no sound at all.
100% local. No account, no sign-in, zero network calls, zero analytics. Your audio is never recorded or sent anywhere, and the production bundle ships a strict CSP (script-src 'self'; object-src 'self') — no remote code, no eval.
A brick-wall output limiter catches EQ boosts before they clip, and every gain change rides setTargetAtTime, so moving a band never pops or crackles.
The Chrome Web Store listing is on the way. Until then it installs in about a minute:
- Grab the latest
umbra-eq-<version>.zipfrom Releases and unzip it, or build from source (see below). - Open
chrome://extensions(oredge://extensions,opera://extensions) and turn on Developer mode. - Click Load unpacked and pick the unzipped folder (the
distfolder if you built it). Chrome 116 or newer.
Note
If the icon does nothing after loading, make sure you selected the dist folder (the build output), not the repo root, and that you are on Chrome 116+. Umbra's audio engine needs the offscreen-document API, which older builds lack.
- 11-band equalizer. Drag the response curve to boost or cut any frequency while the audio plays.
- One sound on every tab. Set the EQ once and it plays on every tab you turn it on for — you just edit what you hear.
- Site rules. Override the global sound on chosen sites by address pattern, for example one rule that covers a video site and all of its mirrors (first match wins).
- Per-tab chains. Each captured tab still gets its own filter chain, so a film tab and a music tab can sound different at the same time.
- Works on Netflix and Spotify, and other streaming sites where audio EQ extensions often go silent.
- Bass boost and volume. One-click bass boost, plus a master volume that goes past 100% for quiet videos.
- Output limiter. A brick-wall limiter catches heavy boosts before they clip, so aggressive presets stay clean.
- Presets. Built-in Bass Boost, Vocal, Movie, and Warm, plus your own — move them as a file or share your presets and rules with a copy-paste code.
- Live spectrum. A visual analyzer behind the curve that shows what you are hearing. It never changes the sound.
- Band guide + full-window editor. An on-screen guide to what each band does, and a full-window view for shaping the global sound on a bigger graph.
- Русский and English, four themes, and a custom accent color.
- Runs on your computer. No account, no network, no analytics. Your audio is never recorded or sent anywhere.
- Play audio in a tab.
- Click the Umbra EQ icon, then EQ This Tab.
- Drag a dot: left and right is frequency, up and down is boost or cut. Shift-drag changes the width, double-click resets a band. The strip on the left is master volume.
- Your EQ plays on every tab. To give a site a different sound, add a rule in the Rules tab like
youtube.orfilm. kino.— it overrides the global sound there. - Each captured tab keeps its own EQ; stop any of them under Tabs. Open Full window (More) to edit the global sound on a bigger graph.
The in-app Guide (More tab) explains all of this, in Russian or English.
| Browser | Status | Notes |
|---|---|---|
| Chrome | Supported | Chrome 116+ (offscreen document + tab capture) |
| Edge | Supported | Chromium, same package |
| Opera | Supported | Chromium, same package |
| Firefox | Planned | Needs a separate content-script engine (Firefox has no tabCapture/offscreen). See FIREFOX_PORT.md. |
For developers
The popup is a React and TypeScript app bundled with Vite and CRXJS. The audio engine (service worker plus an offscreen Web Audio document) stays vanilla.
npm install
npm run build # → dist/ (the loadable, CSP-clean MV3 extension)
npm run dev # HMR dev build
npm test # 46 Vitest unit tests for the audio, preset, and rule logic
npm run typecheck # tsc, also runs in CIThen load the dist folder unpacked (see Install).
To build the uploadable store zip:
npm run build
powershell -ExecutionPolicy Bypass -File build-zip.ps1
# → release/umbra-eq-<version>.zipThe same zip is accepted by the Chrome Web Store, Microsoft Edge Add-ons, and Opera.
Dev loop:
npm run build→ Reload on the extension card → Ctrl+R the popup or full-window page. After avite devrun, deletenode_modules/.viteanddistbefore a real build, ordist/stays a dev-mode stub.
Manifest V3. The popup is React and TypeScript (Tailwind and shadcn/ui) and draws the equalizer as plain SVG. The popup is the source of truth: it resolves each tab (rule → global profile → flat) and pushes the bands to the engine. The audio engine is vanilla: the service worker (src/background.js) owns the offscreen document and mints tab-capture stream ids, and the offscreen document (public/offscreen.js) is a dumb per-tab applier — it builds and holds a chain of 11 biquad filters per captured tab (glided click-free with setTargetAtTime) behind a brick-wall output limiter. Settings, presets, and rules live in chrome.storage, owned by the popup. Pure audio, preset, and rule math sits in src/lib and is unit-tested with Vitest. The content security policy is strict (script-src 'self'; object-src 'self'), so the production bundle has no remote code and no eval.
See PROJECT.md for the full architecture reference and CONTRIBUTING.md to work on it.
Everything runs on your computer. Umbra makes no network requests, has no analytics, and never records or sends your audio. Settings and presets stay in your browser. Full details in PRIVACY.md.
| Layer | Technology |
|---|---|
| Shell | Manifest V3 — service worker + offscreen document |
| Audio | Web Audio API — 11 biquad filters per tab + brick-wall limiter |
| Popup | React 18, TypeScript |
| Build | Vite + CRXJS |
| UI | Tailwind CSS, shadcn/ui, lucide icons |
| Tests | Vitest (46) |
| CI/CD | GitHub Actions — builds the dist/ zip on push, PR & v* tags |
| Suggest a feature | Start a discussion |
| Something broke? | File an issue |
| Like it? | Star the repo — it really helps |
Issues and pull requests are welcome. See CONTRIBUTING.md, or open an issue at https://github.com/skyjacc/Umbra/issues.
- Application code: MIT, see
LICENSE. - Fonts: Inter and Geist Mono under the SIL Open Font License 1.1 (
public/fonts/OFL-Inter.txt,public/fonts/OFL-GeistMono.txt). - UI: React, Tailwind CSS, shadcn/ui (MIT), lucide-react icons (ISC).
- Full third-party attributions:
THIRD-PARTY-NOTICES.md.
Umbra EQ is an independent audio tool. It is not affiliated with, endorsed by, or connected to Netflix, Spotify, YouTube, Google, or any site it processes audio on. All trademarks belong to their respective owners.
chrome equalizer · browser eq · bass boost chrome · parametric equalizer extension · per-tab equalizer · netflix equalizer · spotify equalizer · manifest v3 equalizer · эквалайзер для браузера · усиление баса


