A local desktop app for Windows and macOS, generating songs through MiniMax's hosted Music API. Single user, single machine, no server component — every generation is a direct call from your own machine to MiniMax's API, and everything it produces is written straight to a plain-folder library on your disk that you own and can read without the app.
Pre-built binaries for both platforms are on the Releases page:
.exe (NSIS) or .msi installer.dmgNeither is code-signed, so Windows SmartScreen and macOS Gatekeeper will both flag it on first launch — see the release notes for the one-time bypass on each.
![]() | ![]() |
| Dark | Light |
[Verse], [Chorus],
[Bridge], and eleven others MiniMax recognises.[Verse 1] — with no error and no warning from the API itself. MusicMaxxer
catches this before you spend a generation: it flags the line, suggests the
tag you probably meant, and asks for confirmation if you generate anyway.song.md
recipe (drag it back onto the window to restore every field), an immutable
run.json receipt per take, and a meta.json star rating. Nothing here is
a database — it's just files, readable and greppable without the app.To build from source:
-free tier, both require a funded account —
see SPEC.md §3.5 for what was actually observed here)git clone https://github.com/dexterlagan/MusicMaxxer.git
cd MusicMaxxer
npm install
Run in development mode, with hot reload:
npm run tauri dev
Or build a release bundle for your platform:
npm run tauri build # installer lands under src-tauri/target/release/bundle/
On macOS, npm run app:build / npm run app / npm run app:install are
shortcuts for building, opening, and installing the .app specifically.
On first launch, open Settings (the gear icon) and paste in your MiniMax API key. It's written to the Keychain immediately and never stored anywhere else.
Generated songs are written to ~/MiniMaxMusic by default — one folder per
song, one subfolder per take:
~/MiniMaxMusic/
some-song-title/
song.md the recipe: caption, lyrics, and settings — hand-editable,
rewritten on every generate to match the newest take
song.json machine bookkeeping (take numbering), ignore this
take-01/
track.wav
run.json the immutable receipt for this exact take
meta.json star rating, only written once you rate it
take-02/
...
Drag a song.md onto the app window to restore every field of the form it
came from — title, caption, lyrics, and flags.
crates/
minimax/ API client — typed requests, response parsing, error mapping,
and client-side validation, independently testable against
recorded fixtures (no Tauri, no filesystem, no UI)
studio/ app logic — credentials (OS keychain), the on-disk library
layout, the song.md recipe format, lyric structure-tag linting
src-tauri/ the Tauri shell — the only place that touches the network,
the filesystem, or the API key; every command is the sole
bridge between the webview and everything else
ui/ the compose/history frontend — vanilla TypeScript, no
framework, talks to Rust exclusively through invoke()
design/ the original clickable HTML mockup used to validate the UI
before any of it was built
SPEC.md the build contract — API behaviour (including everything
observed that contradicts MiniMax's own docs), the on-disk
format, and the UI spec section by section
SPEC.md is the source of truth for why things are built the way they are
— it records real observed API behaviour (undocumented duration drivers, the
bracket-singing failure mode, wall-clock timing that doesn't track output
length) rather than assumptions, and flags anywhere the docs and reality
disagreed.
Model, output format, and library location are all configurable from the collapsed panel on Compose. The Cover tab (remixing a reference track) and an optional offline/online lyric-assistant pass are designed in the spec but not yet built.
14 commits
Rust
71.6%
TypeScript
16.6%
CSS
7.8%
HTML
4.0%
A local desktop app for Windows and macOS, generating songs through MiniMax's hosted Music API. Single user, single machine, no server component — every generation is a direct call from your own machine to MiniMax's API, and everything it produces is written straight to a plain-folder library on your disk that you own and can read without the app.
Pre-built binaries for both platforms are on the Releases page:
.exe (NSIS) or .msi installer.dmgNeither is code-signed, so Windows SmartScreen and macOS Gatekeeper will both flag it on first launch — see the release notes for the one-time bypass on each.
![]() | ![]() |
| Dark | Light |
[Verse], [Chorus],
[Bridge], and eleven others MiniMax recognises.[Verse 1] — with no error and no warning from the API itself. MusicMaxxer
catches this before you spend a generation: it flags the line, suggests the
tag you probably meant, and asks for confirmation if you generate anyway.song.md
recipe (drag it back onto the window to restore every field), an immutable
run.json receipt per take, and a meta.json star rating. Nothing here is
a database — it's just files, readable and greppable without the app.To build from source:
-free tier, both require a funded account —
see SPEC.md §3.5 for what was actually observed here)git clone https://github.com/dexterlagan/MusicMaxxer.git
cd MusicMaxxer
npm install
Run in development mode, with hot reload:
npm run tauri dev
Or build a release bundle for your platform:
npm run tauri build # installer lands under src-tauri/target/release/bundle/
On macOS, npm run app:build / npm run app / npm run app:install are
shortcuts for building, opening, and installing the .app specifically.
On first launch, open Settings (the gear icon) and paste in your MiniMax API key. It's written to the Keychain immediately and never stored anywhere else.
Generated songs are written to ~/MiniMaxMusic by default — one folder per
song, one subfolder per take:
~/MiniMaxMusic/
some-song-title/
song.md the recipe: caption, lyrics, and settings — hand-editable,
rewritten on every generate to match the newest take
song.json machine bookkeeping (take numbering), ignore this
take-01/
track.wav
run.json the immutable receipt for this exact take
meta.json star rating, only written once you rate it
take-02/
...
Drag a song.md onto the app window to restore every field of the form it
came from — title, caption, lyrics, and flags.
crates/
minimax/ API client — typed requests, response parsing, error mapping,
and client-side validation, independently testable against
recorded fixtures (no Tauri, no filesystem, no UI)
studio/ app logic — credentials (OS keychain), the on-disk library
layout, the song.md recipe format, lyric structure-tag linting
src-tauri/ the Tauri shell — the only place that touches the network,
the filesystem, or the API key; every command is the sole
bridge between the webview and everything else
ui/ the compose/history frontend — vanilla TypeScript, no
framework, talks to Rust exclusively through invoke()
design/ the original clickable HTML mockup used to validate the UI
before any of it was built
SPEC.md the build contract — API behaviour (including everything
observed that contradicts MiniMax's own docs), the on-disk
format, and the UI spec section by section
SPEC.md is the source of truth for why things are built the way they are
— it records real observed API behaviour (undocumented duration drivers, the
bracket-singing failure mode, wall-clock timing that doesn't track output
length) rather than assumptions, and flags anywhere the docs and reality
disagreed.
Model, output format, and library location are all configurable from the collapsed panel on Compose. The Cover tab (remixing a reference track) and an optional offline/online lyric-assistant pass are designed in the spec but not yet built.
14 commits
Rust
71.6%
TypeScript
16.6%
CSS
7.8%
HTML
4.0%