Make it louder! routes any tab's audio through the Web Audio API and lets you freely amplify it beyond what the browser or OS normally allows. Volume, bass, and stereo/mono mode are all controlled from a clean three-tab popup. Every setting is managed independently per-tab and persisted locally so your levels are remembered for each tab.
Volume
- Amplify audio from 0% (full mute) up to 500% in real time
- Dynamic toolbar badge: blank at 100%, percentage shown above it, red "MUTE" label at 0%
- Warning indicator displayed above 300% to signal potential audio clipping
Advanced audio controls
- Bass boost via a lowshelf filter centered at 200 Hz, adjustable from 0 to +20 dB
- Mono downmix toggle — collapses stereo output to a single centered channel without extra splitter nodes
Presets
| Preset | Volume | Bass | Mode |
|---|---|---|---|
| Movie | 250% | +10 dB | Stereo |
| Podcast | 150% | 0 dB | Stereo |
| Reset | 100% | 0 dB | Stereo |
Privacy
- No network requests of any kind
- Settings are persisted locally via
browser.storage.localand strictly scoped per-tab — your preferences stay on your device and never bleed between different sites or tabs. - Declared as collecting no user data (
data_collection_permissions: none) in the Firefox manifest - Requires only
activeTab,scripting, andstoragepermissions
The extension is composed of three independent scripts that communicate via the browser messaging API.
entrypoints/
├── background.ts Badge manager — listens for volume updates and sets badge text/color
├── content.ts Web Audio engine — injected on demand into the active tab
└── popup/
├── index.html Popup shell with three tabs: Control, Advanced, About
├── main.ts UI controller — handles sliders, presets, and tab switching
└── style.css Self-contained styles, no external dependencies
Each <audio> and <video> element discovered in the page gets its own node chain:
MediaElementSource → GainNode → BiquadFilterNode (lowshelf 200 Hz) → AudioDestination
Elements that are added dynamically (single-page apps, lazy-loaded players) are picked up by a MutationObserver watching document.body. All nodes are disconnected and the AudioContext is closed on beforeunload to prevent memory leaks.
| Requirement | Version |
|---|---|
| Node.js | 18 or higher |
| npm | 9 or higher |
# Install dependencies
npm install
# Launch a dev browser with hot reload (Chrome/Edge)
npm run dev
# Launch on Firefox (Manifest V3)
npm run dev:firefox# Chrome / Edge (Manifest V3)
npm run build
npm run zip
# Firefox (Manifest V3)
npm run build:firefox
npm run zip:firefoxThe zipped extension is written to .output/. The unzipped build is at .output/chrome-mv3/ or .output/firefox-mv3/ respectively.
npm run compile| Tool | Role | License |
|---|---|---|
| WXT v0.20.x | Extension framework — manifest generation, dev server, bundling | MIT |
| Vite v8.x | Bundler (used internally by WXT) | MIT |
| TypeScript v5.x | Static typing across all entrypoints | Apache-2.0 |
| Web Audio API | In-browser audio processing (no native code) | Browser built-in |
| Browser | Supported | Notes |
|---|---|---|
| Chrome / Chromium | It should but didn't try | Manifest V3 |
| Microsoft Edge | It should but didn't try | Manifest V3 |
| Firefox | Yes | Manifest V3 via --mv3 flag |
Contributions are welcome. Please open an issue before submitting a pull request so the change can be discussed first.
- Fork the repository
- Create a feature branch (
git checkout -b feature/your-feature) - Commit your changes
- Open a pull request against
main
Distributed under the MIT License. See LICENSE for details.