Updates

What's shipped in each release. Newest first.

Latest release

v1.3 — generate from a playlist, M3U import, and bulletproof de-duplication

7 May 2026 · Build 7

A bigger update than v1.2.1. Two new ways to scope what the generator picks from, a fix for sets coming up short on time, and a structural overhaul of the de-duplication logic so the same track can't slip into a playlist twice.

Source from a specific Rekordbox playlist (not just the whole library)

The most-requested feature since launch. DJs with big libraries often have a few "lane" playlists curated by hand — by genre, key, BPM range, or just vibe — and want to build a set out of just that selection rather than dipping into everything they own.

The Generated Playlist column now has a Source picker that defaults to "Whole library" but lets you pick any Rekordbox playlist you've imported. The generator scopes to those tracks for everything downstream — genres available in the picker, BPM range bounds, the energy arc — all tighten to match the playlist's contents the moment you switch.

Upload an M3U / M3U8 file as a source

Same idea, but for playlists you've made outside Rekordbox. M3U is a near-universal playlist file format — a plain-text list of audio file paths — and most DJ tools and music apps can export one. boots.list now reads them.

Drop into the Playlist (M3U) tab of the Import Collection card, choose the file, and it becomes a selectable source. Paths in the M3U get matched against your imported Rekordbox library, so the generator still has all the BPM, key, and genre data it needs.

Sets now match the requested duration

A handful of users reported that after re-importing a generated M3U into Rekordbox, the playlist clocked in a couple of minutes shorter than the slot length they'd asked for. The stopping rule was the culprit — the old logic stopped adding tracks the moment the next track would tip the cumulative time past the target, which often left the running time a few minutes under.

Replaced with a simpler rule: keep adding tracks until the cumulative time meets or exceeds the target, then stop. The track that crosses the line stays in. DJs would rather have a couple of spare tracks they can drop than run out of music a minute or two early.

Same track can no longer appear twice

v1.2.1 added de-duplication on Rekordbox track ID and on a normalised artist + title key. That caught most cases, but missed a real one: two library entries that point at the same physical audio file (the user has the same .mp3 added to Rekordbox twice with different metadata). Both passed dedup. Both landed in the M3U. Rekordbox silently collapsed them on import — so the app showed 42 tracks but the imported playlist had 17.

Now the generator filters by both track ID and file path, so duplicates by either dimension are impossible. There's also a belt-and-braces guard inside the build loop: if the track-picker ever hands back a track that's already used (it shouldn't, but…), the loop breaks rather than appending the duplicate. A short playlist plus a clear warning is always better than silent repeats.

"Not enough music" warning instead of padding

If you've narrowed your filters down so far that the unique-track pool runs out before reaching the requested duration, the generator now stops and shows a modal warning explaining how short the slot fell ("only ~42 min of unique tracks available for a 60 min set") and what to try (widen the BPM range, pick more genres, choose a different source playlist).

Previous behaviour was to silently return a shorter playlist, which the user only noticed once they re-imported into Rekordbox. The popup catches it before that.

Other things in this release

Auto-updates for direct-download users (from the next release on)

If you're running the direct-download build, future updates land via an in-app prompt instead of an email + manual re-download. The app checks for new versions at launch and every 24 hours; when one's available you'll see a small "boots.list X.Y is available" dialog with release notes and a one-click Install Update button. App Store users continue to update through the App Store as usual.

This kicks in from the next release onward, so the next time you update you'll see it work.

As always, bug reports and feature requests at contact@bootslist.app — most of v1.3 came from user feedback in the first three weeks of v1.2.x.

Previous

v1.2.1 — bug-fix sweep from launch feedback

28 April 2026 · Build 6

A behind-the-scenes patch driven entirely by reports from the first cohort of users. No new features, but four bugs that were severe enough to ship fast.

Sign in with Google could fail silently on direct-download builds

Some users running the direct-download (non-App Store) build reported that signing in with Google would open the browser, let them complete the Google authentication step, but then leave them stuck on the login screen.

The direct-download build was using a different OAuth flow than the App Store build — a "loopback redirect" that opened a brief local server on 127.0.0.1 to catch Google's redirect. That flow has more failure modes than the ASWebAuthenticationSession path the App Store build uses (race conditions during teardown, conflicts with personal firewalls and security software, sandbox quirks). Both builds now use the same path, which has been running cleanly in the App Store build for weeks. The local-server entitlement was dropped from the direct-download build since it's no longer needed.

Scanner detected almost no BPMs and zero keys on large libraries

A user with ~800 tracks needing analysis reported that after running the scanner, only 3 BPMs had been detected and zero keys. Reviewing the audio analysis code revealed a Swift exclusivity violation in the channel-mixing step: the same in-memory buffer was being passed as both an input and an output to the same vDSP function. In optimised builds this produces silent memory corruption rather than a crash, which is exactly the kind of bug that's invisible in development but disastrous in production.

The mixing step has been rewritten with explicit pointer scopes that copy each input out before computing the next sum. While we were in there, three other improvements:

Playlists were running shorter than requested

Asking for a 90-minute set was producing playlists closer to 55 minutes for some users. The generator was estimating the number of tracks needed by dividing the requested duration by an assumed average track duration (4 minutes), then picking that many tracks. When users had libraries where actual track durations averaged shorter than 4 minutes, the playlist consistently undershot the target.

Replaced the count-based loop with a duration-driven one. The generator now keeps adding tracks until the next addition would put the cumulative running time further past the target than we already are. Result: playlists now match the requested duration to within roughly one track length, in either direction.

A side effect worth flagging: for users whose libraries lean towards extended mixes, you may end up with slightly fewer tracks than before. The generator now favours "closer to the requested time" over "more tracks". This is what the previous behaviour was trying to do; it just had the wrong math.

The same track could appear twice in one playlist

Users with the same song imported as multiple files — for example, an MP3 of an album version and a FLAC of the same release — reported seeing both copies in a single generated playlist.

The generator was de-duplicating only on Rekordbox track ID, which is unique per file. Two files of the same song get two different IDs. Added a second de-duplication pass on a normalised artist + title key. Different mixes of the same song (Original vs. Extended vs. VIP) have different titles and survive — they're different tracks artistically and legitimately belong in a set together. Two copies of literally the same song get collapsed.

If you hit anything else, contact@bootslist.app reaches me directly. Every single bug above was caught by a user — keep the reports coming.

Earlier

v1.2 — Mac App Store launch + direct download via Stripe

23 April 2026

The first publicly-released version. Available on the Mac App Store, with a direct-download option for users who prefer a DMG. Highlights of the launch feature set: