Changelog

Version history and release notes for TabDSP.

Version 0.5.0

April 22, 2026 CURRENT

LUFS 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 .tabdsp files (downloads to your Downloads folder)
  • NEW: Import presets via file picker (.tabdsp or .json files) 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 (.title to .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, 2026

Bug 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, 2026

Sidebar-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, 2026

Bug 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, 2026

Freemium 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, 2026

Compatibility 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 — crossorigin attribute injection + declarativeNetRequest CORS 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 createMediaStreamSource counting 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, 2026

Chrome MV3 Support

  • NEW: Unified manifest.json for both Firefox and Chrome — includes both background.scripts and background.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, 2026

Performance 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, 2026

Bug 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, 2026

Accessibility (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, 2026

Bug 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, 2026

UI 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, 2026

Hybrid Audio Interception

  • NEW: Destination-level audio interception via AudioNode.prototype.connect patching
  • 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

▶ Gear Head Details

Hybrid Interception Architecture

Two interception paths:

  • Media Element chains: Intercepts <audio>/<video> elements via createMediaElementSource() (existing path)
  • Destination chains: Patches AudioNode.prototype.connect to intercept nodes connecting to AudioDestinationNode (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, 2026

Documentation

  • 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-20 offset 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: pendingInjections Map 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-BETA

Initial 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
Request Features

Have an idea? Open a feature request on GitHub Issues with the enhancement label.