Changelog

What we shipped.

Anything bigger than a typo lands here. Producer-readable lead; the under-the-hood line is for engineers who want the receipts.

May 2026

DSPFix

Bass pre-ring on corrected renders — fixed

The tone-y ‘buzz’ that producers could hear right before every kick is gone. Re-render any mix that had it.

Under the hood

Two pre-ring sources closed: reference-match FIR converted to minimum-phase (homomorphic), and mono_below side high-pass switched from sosfiltfilt (zero-phase, symmetric impulse response) to a 4th-order sosfilt (minimum-phase). Bench-measured 115 dB and 196 dB reduction respectively, with full magnitude preservation. 24 / 24 correctives tests pass.

PerformanceUX

Player loads ~9× faster

Mix playback now starts almost instantly instead of waiting for the full WAV. The 24-bit master is still there for downloads and the corrective render.

Under the hood

Post-analysis and post-render encode tasks generate a 128k joint-stereo MP3 preview to R2. WaveformPlayer prefers preview over the full WAV; falls back gracefully when the encode task hasn't landed yet (~5s after the score).

UXDSP

Spectral emphasis chips — plain-language EQ readout

The spectrum chart now shows what's actually off in producer vocabulary: ‘Low-mid buildup +3.2 dB,’ ‘Lacking air −4.6 dB,’ ‘Bright,’ ‘Harsh,’ ‘Mid scooped.’ When everything's within ±1.5 dB of target, a single positive-confirmation chip says so.

Under the hood

Pure helper in frontend/lib/spectral-emphasis.ts; severity tiers at 1.5/3/5 dB. Sorted worst-first so the producer's eye lands on the worst band first.

Trust

Methodology page now shows real FFmpeg comparison data

Cross-check the meter against the reference: MixLens vs FFmpeg loudnorm on three test signals, all within 0.1 LU.

Under the hood

Numbers generated against pyloudnorm 0.1.1 / ffmpeg 7.1.4 in the prod container at commit time. Within the ±0.1 LU inter-meter tolerance every BS.1770-5 implementation targets.

Trust

Privacy + Terms pages

Public Privacy Policy and Terms of Service. Same direct voice as the rest of the site, no legal-ese, lead with an ‘In short’ block.

UX

Free → Pro: visible at the wall moments

Free users now see ‘2 of 3 renders left this month’ inline on the Render button. At 0 left, the button becomes ‘Upgrade to render’ — no more wasted click into a 402.

Under the hood

Pre-emptive quota meter via /api/billing/usage; locked Pro features (REFERENCE_MATCH_EQ, webhooks) now surface a Pro badge before click instead of silently 402-ing at render time.

Integrations

Public /integrations page

Data-driven listing of every way to wire MixLens into your stack: bearer API, signed webhooks, desktop CLI with watch-folder mode, MCP server for Claude Desktop / Cursor, Discord relay example.

Integrations

MCP server for Claude Desktop / Cursor

Tell your assistant ‘run this WAV through MixLens’ and it does. Seven tools: analyze, list, get, render, auto_fix, get_render, whoami.

Under the hood

stdio FastMCP server in examples/mcp-server/. Uses the same presigned-PUT upload flow the web frontend uses. Responses are pruned to structured fields only — no signed URLs the model could quote at users.

Integrations

Webhooks: signed POSTs for analysis + render events

Wire MixLens events into Discord, Slack, CI, anything that takes a webhook. HMAC-SHA256 signed, retried with exponential backoff, every delivery logged.

Under the hood

analysis.complete / analysis.failed / render.complete / render.failed. 1m → 5m → 30m → 2h backoff, 4 attempts max. /account/webhooks for the Pro management UI, Free users see a sales surface with Discord / Slack / CI use cases.

Integrations

Desktop CLI: analyze, watch, CI gate

Score any bounce from your terminal. `mixlens watch ~/Bounces` auto-uploads new exports. `--fail-on-band=almost` exits non-zero in CI when a mix isn't release-ready.

PerformanceFix

Direct-to-R2 upload — no more upload timeouts

Files now go from your browser straight to storage via presigned URL, instead of streaming through the API. Bigger files just work.

Under the hood

POST /api/uploads/presign issues a 10-minute signed PUT URL; browser PUTs the file directly to R2; metadata-only POST to /api/mixes/from-upload creates the row. Multipart-through-gunicorn fallback when R2 isn't configured (dev).

UX

Compare mixes side-by-side

Pick two of your analyzed mixes; see the score deltas, what each one flagged, where they agree and disagree. Helps when you're A/B'ing arrangements or revisiting an old session.

UX

/mixes: card grid, search, filter chips, cursor pagination

Your library now scales past a couple of tracks. Search by title, filter by band or corrected status, sort by score or recency. Per-card archive button — clean up the bench without losing history.

Got a request or a bug?

Send it to hello@mixlens.io. We treat measurement drift and audible artifacts as ship-blockers, not nice-to-haves — see the bass pre-ring fix above for the receipts.