Changelog
Version history and release notes for TabDSP.
Version 0.5.0
April 22, 2026 CURRENTLUFS Stack
- NEW: LUFS Stack analysis panel — dedicated collapsible panel with Meter (M/S/I bars), Target Validator (I/LRA/TP modes with delta display), and scrolling Histogram (momentary green, short-term blue)
- NEW: LRA (Loudness Range) computation from short-term loudness distribution
- NEW: Target Validator inherits target from active compliance preset automatically
- NEW: Histogram modes — SCROLL (10-second window) and FIT (full analysis history)
- NEW: Explicit Analyze start/stop toggle and Reset button for LUFS measurements
- CHANGED: LUFS Stack restyled with card treatment, CSS variables, SVG lock icons for tier-locked features
- NEW: LUFS locked upgrade prompt for free-tier users
Independent L/R Stereo Meters
- NEW: Independent left/right stereo meters for both IN and OUT level meters
- NEW: Parallel dead-end ChannelSplitter + dual AnalyserNode taps at input and output stages
- NEW: Per-channel peak and RMS readings (
inputPeakL/R,inputRmsL/R,peakL/R,rmsL/R)
File-Based Preset Import/Export
- NEW: Export presets as
.tabdspfiles (downloads to your Downloads folder) - NEW: Import presets via file picker (
.tabdspor.jsonfiles) or drag-and-drop
UI/UX Refinements
- CHANGED: Compact toolbar with popovers for presets and settings
- CHANGED: Module strip and canvas layout refined
- CHANGED: Module glow refined to perimeter-only; improved locked module readability
- CHANGED: Toolbar title/badge enlarged, branding centered
- CHANGED: Band panel auto-hide with fade timing, canvas-leave detection, auto-dismiss
Limiter UI Refinements
- CHANGED: True Peak/Sample Peak cycle button replaces previous toggle
- CHANGED: Both sample peak and true peak bars always visible in True Peak mode
- CHANGED: Limiter meter redesign
Bug Fixes
- FIXED: Firefox standalone window resize freeze
- FIXED: Enable onboarding overlay for sidebar/window modes
- FIXED: tabCapture tier enforcement — harmonized bypass with state flag tracking
- FIXED: E2E smoke test selectors for unified toolbar rename (
.titleto.toolbar-title)
Documentation
- FIXED: Signal flow accuracy, test counts, post-dynamics analyser references, version strings
- FIXED: Outdated documentation — node counts, version refs, false claims corrected
- REMOVED: Firefox resize freeze from Known Bugs (resolved)
Testing
- NEW: Test suite expanded to 978 tests (698 Vitest unit + 238 Chrome E2E + 42 Firefox E2E)
Version 0.4.1
April 13, 2026Bug Fixes
- FIXED: Stale Delete/Export button states after sidebar retarget, window retarget, cross-mode sync, A/B toggle, undo, and redo
UI Improvements
- CHANGED: Preset import toast restyled — larger, green gradient, centered over preset bar
- NEW: Preset placeholder reload — click active preset name in dropdown to reload it
Audio Engine
- NEW: Late-created AudioContext destination chain building — contexts created after enable automatically get DSP chains
Testing
- FIXED: Undo-redo test timing adjusted for debounce accommodation
- NEW: E2E test for late-created AudioContext chain building
Version 0.4.0
April 9, 2026Sidebar-First UI
- NEW: Sidebar and standalone window are now the primary UI — popup panel removed as default
- NEW: Dynamic tab retargeting — sidebar follows active tab, re-targets on tab switch
- NEW: Header redesign with state-aware source dot and prominent Enable checkbox
- NEW: Onboarding overlay for first-time users
Per-Hostname State
- NEW: EQ, compressor, limiter, multiband, and gain parameters persist per hostname
- NEW: A/B comparison, undo/redo history, Auto-Enable, and CORS settings are per-hostname
- NEW: Delta undo system — only changed parameters are stored per undo step
Auto-Enable & DRM Detection
- NEW: Auto-enable on page interaction — deferred DSP activation triggered by user gesture
- NEW: DRM detection push mechanism (A+C) — proactive notification + storage persistence for reliable tabCapture fallback
Bug Fixes
- FIXED: Chrome 146 browser detection — uses Firefox-only API for reliable detection
- FIXED: ENABLE registration — announcement pattern ensures engine registration before activation
- FIXED: GET_TAB_STATUS retry-failure response missing fields
- FIXED: tabCapture spectrum — blocky display, level offset, and flashing resolved
- FIXED: DRM detection timing — passive flag + immediate push + storage persistence
- FIXED: Post-dynamics spectrum tap — multiband output only
- FIXED: Chrome Side Panel open/close
- FIXED: 3 redundant browser detection guards replaced with feature detection
Testing
- NEW: Test suite expanded from 415 to 909 tests (+119%)
- NEW: Istanbul coverage instrumentation — worklet coverage 99.68% statements
- NEW: Professional measurement-based validation with ITU-R BS.1770-4 compliance
- IMPROVED: DSP test tolerances tightened to professional standards
Version 0.3.1
March 18, 2026Bug Fixes
- FIXED: Multiband crossover hover cursor blocked by inline style specificity
- FIXED: Compressor/limiter threshold drag not working without active audio
- FIXED: Bypass arc rendering for consecutive modules
UI Improvements
- CHANGED: Tier badge eye icon replaced with key icon
- NEW: Free tier green pulse animation on tier badge
- NEW: Limiter ceiling line hover cursor feedback
Documentation
- NEW: Terms of Service, Privacy Policy, and Refund Policy pages
- NEW: Licensing nav link, Lemon Squeezy checkout overlay, store CTAs
- FIXED: Docs/v2 audit — DSP accuracy fixes, content gaps, a11y, UI overview zones
- FIXED: Documentation drift from project audit (5 items)
Development Tooling
- NEW: Automated test suite — 415 tests (294 Vitest + 121 Playwright E2E)
- NEW: ESLint v9, GitHub Actions CI, Claude hooks and skills
- NEW: V8 coverage reporting
Version 0.3.0
March 10, 2026Freemium Tier System
- NEW: Three-tier feature gating — Free (EQ + spectrum + RMS + linear phase + M/S), Enthusiast (+ compressor + module reorder), Professional (+ multiband + limiter + LUFS + all presets)
- NEW: Defense-in-depth enforcement — popup UI gating + DSP-level force-bypass + LUFS suppression
- NEW: License panel — key input, tier badge in header, upgrade prompt overlay, locked module states
- NEW: Lemon Squeezy server-side license validation — activate/validate/deactivate API, subscription + perpetual license types
- NEW: Device limiting — 6 activations per key, activation count display
- NEW: Offline grace periods — 7 days (subscription), 90 days (perpetual), automatic downgrade when expired
- NEW: Background re-validation via chrome.alarms (24-hour interval)
- NEW: Cross-mode license sync via storage.onChanged
- NEW: Uninstall deactivation page — automatically frees activation slot on extension removal
- NEW: Grandfather clause — existing users auto-granted permanent Professional on upgrade
- NEW: Preset lock indicators for presets using tier-locked features
Background Tab Overlay & Sidebar Robustness
- NEW: "Visualization Paused" overlay when target tab is in background
- NEW: Auto-retarget on target tab close — sidebar queries newly active tab
- NEW: Sidebar re-targeting via storage.onChanged
- NEW: Standalone window retargets via URL update
- NEW: Popup storage isolation — popup always targets current active tab
- NEW: Firefox user gesture preservation — sidebarAction.open() called synchronously
- NEW: Stale tab ID validation — checks window membership
- NEW: Navigation re-initialization on tabs.onUpdated for per-tab reattachment
Canvas Render Dispatch Fix
- FIXED: COMP/LIMIT canvases not rendering on module switch when no audio playing
Documentation
- NEW: Licensing & Tiers page with feature comparison and activation guide
- UPDATED: Privacy disclosure — accurate LS API call documentation
- UPDATED: Permissions table — added alarms, tabCapture, offscreen, declarativeNetRequest
- FIXED: quick-start.html DRM note — Chrome tabCapture documented accurately
- FIXED: signal-flow.html post-dynamics analyser — "after last dynamics module" not "after Multiband only"
- NEW: Display Modes section in UI overview
Version 0.2.7
March 4, 2026Compatibility Audit
- NEW: Silence detection on media element chains — monitors post-capture audio, reports to popup after 2 seconds of silence
- NEW: Opt-in CORS expansion for cross-origin audio —
crossoriginattribute injection +declarativeNetRequestCORS headers for allowlisted CDN domains - NEW: Chrome tabCapture fallback for DRM-protected content — offscreen document with full DSP chain via
chrome.tabCapture - NEW: WebRTC detection — observational
createMediaStreamSourcecounting with popup status display - FIXED: Offscreen document module reorder now uses 50ms crossfade (parity with other chain types)
- CHANGED: Safari and Edge moved to future browser targets
- REMOVED: Linear phase EQ zippering from Known Bugs (resolved)
Version 0.2.6
February 28, 2026Chrome MV3 Support
- NEW: Unified
manifest.jsonfor both Firefox and Chrome — includes bothbackground.scriptsandbackground.service_worker - NEW: CSP-immune worklet URL injection adapted to each browser's messaging requirements
- NEW: Persistent background state via
chrome.storage.session - FIXED: Chrome compressor/limiter canvas waveforms not displaying — Chrome's message bus uses JSON serialization (not structured clone), breaking Float32Array history buffers; now serialized transparently
- FIXED: Worklet loading permanently cached failure when URLs not yet available via async messaging
- FIXED: Async response pattern for Chrome compatibility
- CHANGED: Firefox minimum version bumped from 112.0 to 121.0
Version 0.2.5
February 27, 2026Performance Optimization
- IMPROVED: Total estimated CPU usage reduced from ~5.1% to ~3.8% (all features enabled), ~2.7% typical
- IMPROVED: Linear Phase EQ rewritten with FFT overlap-add (1024-pt radix-2 Cooley-Tukey) — ~4x faster
- IMPROVED: Limiter lookahead uses monotone deque sliding window maximum — O(1) amortized
- IMPROVED: Compressor/limiter worklet postMessage uses Transferable arrays (zero-copy)
- IMPROVED: LUFS meter circular buffer with O(1) running sums for absolute gate
- IMPROVED: Multiband compressor pre-allocated buffers and hoisted coefficients
- IMPROVED: Conditional meter payload, spectrum pre-pass, visibility-gated metering, cached DOM queries
Documentation
- FIXED: Stale CQT/Goertzel spectrum references corrected to FFT 8192 + constant-Q power summation across 11 pages
- FIXED: Linear phase EQ performance numbers updated
Version 0.2.4
February 27, 2026Bug Fixes
- FIXED: GPU usage scaling linearly with bypassed module count (87% to 220% in Firefox Process Manager) — removed
filter: drop-shadow()from bypass arc SVG path and arrow elements that forced per-frame Gaussian blur re-computation at 60fps per bypassed module
Version 0.2.3
February 26, 2026Accessibility (Phase 6)
- NEW: ARIA roles and labels on all interactive controls (knobs, bypass buttons, toggles, meters)
- NEW: Full keyboard navigation — Arrow/PageUp/PageDown/Home/End on all knobs and sliders
- NEW: Module reorder buttons with screen reader live region announcements
- NEW: Focus management for floating panels and confirm dialogs
- NEW: 1Hz throttled ARIA meter updates (separate from 60fps visual loop)
New Features
- NEW: Permission revocation detection with actionable user messaging
- NEW: CSP-immune worklet URL injection for improved site compatibility
- NEW: DRM/unprocessable audio notification when audio cannot be intercepted
- NEW: Compliance warning indicator in limiter panel (caution/warning severity)
Bug Fixes
- FIXED: -12dB HF rolloff in digital mode caused by WaveShaper anti-aliasing filter
- FIXED: Metering bugs at 0 dBFS (history buffers, scalar fallbacks)
- FIXED: GET_STATUS race condition on first popup open
- FIXED: Keyboard shortcuts (E, D, L, M) now properly propagate DSP state changes
Cleanup
- REMOVED: ~1350 lines of legacy DOM code (HTML, CSS, JS)
- REMOVED: Orphaned CQT analyzer worklet file
Version 0.2.2
February 23, 2026Bug Fixes
- FIXED: Sidebar no longer auto-opens on extension install
- FIXED: Source count on YouTube showing "2" on first enable — now filters closed AudioContexts and reports combined total
- FIXED: Destination chain sidechain HP filter stuck at 20Hz (wrong parameter name)
- FIXED: A/B bypass now toggles processing on destination chains (YouTube, SoundCloud)
- FIXED: LUFS meter reset now works on destination chains
- FIXED: Compressor meter 0 dBFS no longer misread as -96 dB
New Features
- NEW: Install/update badge notification on extension icon — clears on first popup open
- NEW: Standalone window closes automatically when its associated tab is closed
- NEW: Standalone window reloads when its associated tab refreshes
- NEW: Status notification banner when audio processing is restricted or no sources detected
Version 0.2.1
February 19, 2026UI Improvements
- NEW: Collapsible preset section with chevron toggle; undo/redo buttons relocated to header controls row
- NEW: Info icon in header linking to documentation modules page
- FIXED: Multiband crossover lines now have visible grab handles (hover/drag highlight)
- FIXED: Slider/knob sensitivity — input/output gain, EQ, and multiband knobs had too-coarse sensitivity
- FIXED: Factory presets V1-to-V2 migration bug; all 8 presets now differentiated with unique multiband settings
Version 0.2.0
February 16, 2026Hybrid Audio Interception
- NEW: Destination-level audio interception via
AudioNode.prototype.connectpatching - NEW: Works on sites that use Web Audio API directly (e.g., SoundCloud) without
<audio>/<video>elements - NEW: Cross-origin media element detection prevents audio silence on sites like Bandcamp
- NEW: Full DSP parity for destination chains: bypass, enable/disable, metering, multiband, spectrum analysis
M/S Processing & Linear Phase EQ
- NEW: M/S (Mid/Side) processing mode for destination chains with separate Mid and Side EQ
- NEW: Linear Phase EQ (511-tap FIR) for destination chains
- NEW: M/S solo monitoring (Mid Solo / Side Solo) for destination chains
- IMPROVED: Linear phase FIR zippering reduced via fingerprint dedup, crossfade snapshot, and throttled FIR regeneration
Bug Fixes
- FIXED: Background audio artifacts when tab is hidden (suspend/resume analysis nodes on visibility change)
- FIXED: Compressor makeup gain visualization (set worklet parameter instead of external GainNode)
- FIXED: Cross-origin media elements no longer cause audio silence (Bandcamp, CDN-hosted media)
Distribution
- CHANGED: Downloads moved to dedicated releases page on GitHub Pages
- NEW: Public feedback repository for bug reports and feature requests
- CHANGED: Auto-update manifest now uses GitHub Pages URLs
▶ Gear Head Details
Hybrid Interception Architecture
Two interception paths:
- Media Element chains: Intercepts
<audio>/<video>elements viacreateMediaElementSource()(existing path) - Destination chains: Patches
AudioNode.prototype.connectto intercept nodes connecting toAudioDestinationNode(new path)
Destination chains now support the full DSP feature set: bypass, enable/disable, metering, multiband compression, spectrum analysis, M/S mode, and linear phase EQ (~42 new audio nodes per chain).
Cross-Origin Detection
Added origin comparison check before calling createMediaElementSource(). Cross-origin media elements without CORS headers are skipped to prevent the Web Audio API from taking over audio output and producing silence.
Known Limitations
- Linear phase EQ has residual zippering during fast EQ parameter drags (deferred for later refinement)
- Sites using only cross-origin
<audio>elements (e.g., Bandcamp) pass audio unprocessed - Destination chains omit the EQ input saturation stage, color filter, solo bandpass, and multi-stage HP/LP (minor feature delta)
Version 0.1.1
February 10, 2026Documentation
- NEW: V2 documentation site deployed to GitHub Pages
- 10 comprehensive pages with dual-audience approach (Essential + Gear Head Details)
- Dark/light theme toggle with system preference detection
- Search modal with keyboard shortcut (Cmd/Ctrl + K)
- Responsive design for desktop, tablet, and mobile
- Complete module reference (EQ, Compressor, Multiband, Limiter)
- 35+ glossary terms with technical deep-dives
- Signal flow diagrams and use case examples
Code Quality & Stability
- FIXED: Extension disconnection handling (logs warning, stops meter updates)
- FIXED: RMS sum drift prevention in compressor/multiband/LUFS worklets (periodic recalculation)
- FIXED: GC pressure reduction (~160k fewer allocations/sec via Float32Array meter messages)
- FIXED: Concurrent injection race condition in the background layer (pending-injection tracking map)
- FIXED: Denormal protection in compressor, multiband, LUFS meter worklets
- FIXED: Coefficient smoothing for HP filter and crossovers (prevents clicks)
- FIXED: FIR coefficient crossfade in linear-phase-eq (prevents glitches)
- FIXED: AudioContext memory leak on page navigation (page-unload cleanup)
- FIXED: Firefox scrollbar styling in popup
- REMOVED: ~135 lines of dead CSS (legacy multiband meters, unused selectors)
- REMOVED: Dead message handlers in the audio engine (SET_INPUT_GAIN/SET_MASTER_GAIN)
- REMOVED: Dead code in the UI layer (empty stubs, unused variables)
- REMOVED: Legacy signal chain nodes (dynDry/dynWet/dynSum)
Browser Compatibility
- FIXED: roundRect polyfill for older browsers without Canvas roundRect support
- FIXED: CSS undefined variables (4 variables fixed)
▶ Gear Head Details
Comprehensive Code Review (Feb 8-9, 2026)
Two-phase systematic review covering all worklets, the audio engine, the UI layer, message passing, CSS/HTML, and performance profiling.
Key Technical Fixes
- Denormal protection: Added
1e-20offset to prevent denormal CPU penalties in feedback loops - RMS drift fix: Periodic sum recalculation every 10 seconds prevents floating-point accumulation errors
- GC pressure: Replaced
Array.from()with direct Float32Array in postMessage (reduces heap allocations by ~160k/sec) - Coefficient smoothing: Exponential smoothing on crossover/filter coefficients prevents zipper noise during parameter changes
- FIR crossfade: 50ms blend when switching linear phase EQ coefficients eliminates glitches
Architecture Improvements
- Injection race condition:
pendingInjectionsMap prevents duplicate injections when tabs send concurrent requests - Extension lifecycle: Proper disconnection detection with console warnings and meter update cleanup
- Memory management: AudioContext cleanup on page-unload prevents orphaned contexts
Version 0.1.0
February 7, 2026 PRE-BETAInitial pre-beta release. First signed and self-distributed version.
Core Features
- 8-Band Parametric EQ with real-time spectrum visualization (CQT analyzer)
- Linear Phase Mode (511-tap FIR) for transparent phase-coherent processing
- M/S Processing with separate Mid and Side EQ, solo monitoring
- Single-Band Compressor with RMS/Peak detection, sidechain HP filter
- Multiband Compressor (3-band/4-band) with LR4 crossovers
- True Peak Limiter with 4x oversampling (ITU-R BS.1770-4 compliant)
- LUFS Metering (Momentary, Short-term, Integrated)
- Input/Master Gain Controls (-24 to +24 dB)
UI/UX Features
- Modular UI Design with module blocks and canvas switching
- Drag-and-Drop Module Reordering with glitch-free crossfade
- Interactive Canvases: EQ spectrum, compressor waveforms, limiter stereo meters
- Global Meter Section showing all module levels (IN/EQ/MB/COMP/LIM/OUT)
- Floating Control Panels for EQ bands and multiband bands
- A/B Comparison with keyboard shortcut (A key)
- Preset Management: 8 factory presets, 15 compliance presets, custom preset save/load/export/import
- Site Override for per-domain settings
- Bypass Visualization with orange routing arcs and consecutive bypass spanning
Audio Quality
- CQT Spectrum Analyzer: 60 bins (6 per octave), Q = 8.65, Goertzel-based
- Higher-Order Filters: 12/24/36/48 dB/oct with Butterworth and Linkwitz-Riley options
- True Sidechain HP Filtering: Detection path only, preserves output bass
- Soft Knee Compression: Smooth transition region around threshold
- True Peak Detection: 4x polyphase FIR oversampling with ITU/Kaiser modes
- Silent Enable/Disable: No clicks, pops, or stutters when toggling processing
Performance
- CPU Usage: 2-5% typical (modern systems), <5% target achieved
- Efficient Rendering: document.hidden check prevents background rendering
- Optimized Message Passing: Float32Array meter data, debounced updates
Distribution
- Firefox Self-Distribution: Signed via AMO, hosted on GitHub Pages
- Auto-Updates: Update manifest at tabdsp.com/updates.json
- Downloads: tabdsp.com/releases/
▶ Gear Head Details
Signal Flow Architecture
Fixed modules: input stage (gain → DC blocker → input analysis tap → CQT pre-analyser) and output stage (limiter → output analysis tap → LUFS meter → master gain).
Draggable modules: EQ (input saturation → HP/LP → bands → color filter → linear-phase stage → M/S), single-band compressor (worklet + makeup gain), multiband compressor (LR4 crossovers).
Reordering: chain rebuild reconnects nodes based on the user's module order. A 50ms crossfade is applied when reordering to prevent glitches.
Phase 4: Modular UI Redesign (Complete)
Module blocks with color-coded active states, global canvas container with module switching, parameter panels for all modules, visual consistency across 10 canvas fixes, legacy cleanup (~200 lines CSS/JS removed), meter release smoothing (24 dB/sec), Show Both Peaks toggle.
Phase 5: Drag-and-Drop (Complete)
Drag event handlers, drop zone detection, invalid drop visual feedback, DOM rebuild on reorder, audio engine integration via SET_MODULE_ORDER, connector pulse animation, U-shaped bypass arcs with consecutive spanning logic, shifting animations for displaced modules.
Known Limitations
- Firefox MV3 only (Chrome support added later) — Resolved in v0.2.6
- DRM-protected content cannot be processed (EME limitation)
- Test harness routes audio outside intercepted extension chain (needs refinement)
Planned Features
These features are under consideration for future releases.
Accessibility
- High Contrast Mode: WCAG AAA compliance
Advanced Features
- Dynamic EQ: Frequency-dependent compression (soothe2-style)
- Spectral Processing: FFT-based noise reduction, de-essing
- Convolution Reverb: Impulse response-based room simulation
- Auto-Gain: Automatic makeup gain calculation for compressors
UI/UX Improvements
- Preset Browser: Categorized preset library with search
- Visual EQ Matching: Drag target curve, auto-calculate band parameters
- Waveform Display: Full audio waveform with zoom/pan
- Customizable Themes: User-defined color schemes
Have an idea? Open a feature request on GitHub Issues with the enhancement label.