Open-source DJ companion for macOS, built with Swift and SwiftUI, that detects BPM and key, tags and renames tracks in DJ format, and manages playlists and favourites. Audio analysis runs through a Python toolkit invoked as a subprocess; playlists, favourites and recents are persisted to a local SQLite database.
- Modulr.app: entry point to the system. SwiftUI interface for browsing folders, playlists and favourites, tagging tracks and playback. Calls the Python toolkit for analysis and SQLite for persistence.
- scripts/analyze.py: detects BPM and key (Essentia, madmom, librosa fallback) and measures loudness (ffmpeg
volumedetect). - TagEditor / TagService: reads and writes tags, renames files to
title_KEY_BPM, fetches artwork via the iTunes API. - PlaylistStore / RecentsStore: SQLite persistence for playlists, favourites and recents.
All app-to-toolkit communication runs through subprocess calls to analyze.py.
Local SQLite database, no server, no network calls beyond the iTunes artwork lookup:
playlists+playlist_tracks: ordered track URLs per playlist, soft-deleted viadeleted_at- Recents and favourite folders/tracks persisted the same way
- Swift + SwiftUI, AVFoundation, Accelerate
- Python (essentia, madmom, librosa, ffmpeg, mutagen)
- macOS 14 (Sonoma) or later, Xcode command line tools, Homebrew
git clone https://github.com/johnshields/modulr.git
cd modulr
bash scripts/setup.shOne-time brew + pip dependencies.
bash scripts/run.sh --installBuilds a release binary, wraps it as Modulr.app, installs to /Applications and launches it.
bash scripts/package.shBuilds dist/Modulr-<version>.dmg and prints its sha256 for Casks/modulr.rb. Set DEVELOPER_ID and NOTARY_PROFILE to sign and notarise.
brew install --cask fromlost/modulr/modulrSee assets/user-guide.md for a walkthrough with screenshots.
- BPM + key detection, Camelot-compatible key highlighting, search by title, key or BPM
- Tag editor with iTunes artwork finder, DJ-format rename
title_KEY_BPM - Loudness measure and match, tempo + pitch bake
- Bulk move, add and re-analyse tracks via sortable track-picker sheets
- Playlists, favourites and recents in a local SQLite database
- Rekordbox-style RGB waveform and spectrogram with cutoff quality verdict
- Open With integration (single-instance window)
