Suno hands you a loose export: quiet, untagged, four seconds of silence on the front. Drop it in here and get back a trimmed, level-matched, fully tagged track with tempo and key already written in — ready to drag straight into your crate.
Every export lands with a generated filename, no artist, no tempo and a different loudness to the one before it. You find out mid-set, when the next track drops 6 dB.
Nothing here guesses. Each pass is a measurement or an edit with a defined output, and your original file is never touched.
Reads the MP3 or WAV Suno gave you and works on a copy. The source file stays exactly where it was.
Cuts the silence off both ends at a −50 dB threshold, then puts a 10 ms fade on each edge so the deck doesn't click when you cue it.
Measures integrated loudness and normalises every track to the same target, with true peak held at −1 dBTP. No more reaching for the trim knob between tracks.
Detects BPM and musical key, and reports how confident it is. AI-generated tracks drift more than commercial ones, so a low confidence score is a flag to check the grid by hand.
Artist, title, album, genre, year, artwork, BPM and key go into the fields Serato actually reads — so the library columns fill themselves in.
24-bit WAV for the archive or 320 kbps MP3 for the gig bag, named Artist - Title so the crate sorts properly.
Serato stores cues and beat grids in its own tag block. Writing them from outside the app is possible but fiddly — this one comes after the rest is solid.
This is a front-end prototype — the timings and readouts below are staged, so you can see the shape of the thing before any audio code gets written.
MP3 or WAV — or click to pick a file
Nothing is uploaded · runs on your machineSaved as Kay2 - Midnight Aisle.wav —
Written for whoever picks this up next.
Trimming, loudness, tempo, key and tags are all deterministic signal processing. Pointing an AI model at the job is why the first attempt fell over — there's nothing for it to infer.
Everything on this page is a library call.
Workers can't run native binaries and cap CPU time, so audio decoding will time out. ffmpeg.wasm in the browser does the same work on the visitor's machine — files never upload, hosting stays static, and there's nothing to pay for.
ffmpeg.wasm for trim, fade, loudnorm and export. essentia.js for tempo and key. browser-id3-writer for the tags. Vanilla JS for the rest.
Batch uploads or very long files are the case for moving off the client. Cloudflare Containers will run real ffmpeg; pair it with R2 for the in and out buckets and keep the Worker as the router only.
Cue points and beat grids live in custom GEOB frames that Serato writes itself. The format has been documented by the community but it isn't official — treat it as version 2 and ship the rest first.
A Suno Pro plan exports up to 12 time-aligned stems. If this tool ever grows a second mode, accepting a stem folder and building a DJ edit from it is the obvious direction.