Vibrai v1.6.1
Three things in this release change how a session actually goes: you can name the key you want and have Vibrai build in it, the Claude Desktop bundle lands somewhere Finder will show you, and automation stopped running before your instruments existed.
Ask for a key and get it
A genre preset decided the key for you. Now you say what you want:
vibrai genre apply techno hypnotic_1 --scale-root D --scale-name DorianThe same --scale-root / --scale-name pair works on vibrai start genre-song, vibrai plan and vibrai generate, and on their MCP equivalents — apply_genre, start_genre_song, plan, generate.
The important part is when it happens. Vibrai re-keys the composition as it renders, in a single pass, rather than writing the preset's key and transposing after the fact. What comes out is a song in the key you asked for, not a song in the preset's key that has been moved.
Leave the flags out and nothing changes — the preset's own key wins. Vibrai only looks at your open Live set's key when nobody has chosen one, and any part or section pinned to its own scale is left alone.
Chords follow the mode now as well. Vibrai's two chord banks were locked to Aeolian and Ionian no matter what you asked for, so a Dorian project got Aeolian harmony underneath it. Roots and thirds are now built from your project's own mode. Every shipped genre defaults to Minor, so their output is unchanged — this only shows up when you ask for something else.
The Claude Desktop bundle, somewhere you can find it
If you installed Vibrai from the macOS .pkg, dragging Vibrai.mcpb into Claude Desktop is the only way to connect the two — nothing in Vibrai writes Claude Desktop's config for you. That file lived in /usr/local/lib/vibrai, a folder Finder hides by default. The install ended at a door you couldn't open.
vibrai install claude-extension --revealThe bundle now goes into your Ableton User Library under Vibrai/, and --reveal opens a Finder window with it already selected, ready to drag into Claude Desktop → Settings → Extensions. Vibrai reads your real User Library location out of Live's own preferences instead of assuming the default path.
vibrai install all does this as part of a full install, and install_claude_extension is the MCP equivalent.
Automation is its own step
vibrai generate used to write automation as part of the render — and it did it before loading any instruments. Anything aimed at a track it had just created had nothing to aim at yet, so it failed every time, and an explicit automation slot would stop the render outright.
Automation now runs after the instruments do:
vibrai generate --project my-song.vibrai
vibrai automation render --project my-song.vibraiOr have generate do it inline, as its last step:
vibrai generate --project my-song.vibrai --with-automationA target Vibrai can't resolve is no longer fatal. Each one is reported with the device it went looking for and the controls that device actually exposes, so you can see what to change.
One thing worth knowing: if a bounce fails and Vibrai can't put your arrangement clips back, the CLI exits with code 13, and the MCP response carries a data_loss message. That is the signal that clips were deleted and did not come back — check it rather than counting skipped entries.
Turn track numbering on and off
Ableton displays a leading # in a track name as that track's position, so # Bass shows up as 1 Bass. Vibrai could write that token but had no way to remove it, which meant a numbered set had to be renamed track by track.
vibrai track auto-number offIt sweeps every track in the open set. Turning it off strips a leading number only when that number matches the track's own position, so a track you named 808 Bass is left alone. Add --persist to make it the project's default. On MCP it's set_track_auto_numbering.
Where a project file lands by default
This one changes what an existing command does. Leave out --project and Vibrai used to reach for Untitled.vibrai. It now uses the name of the directory you're working in — so in ~/Music/dawn-chorus you get dawn-chorus.vibrai.
If you have projects named Untitled.vibrai, commands that used to find them won't any more. Rename the file, or point the command at it explicitly. Where Vibrai can tell that's what happened, the error says so.
Also fixed
- The install guide described a command that doesn't exist.
vibrai install statuswas never real, and the guide claimed the.pkgregisters the MCP server with Claude Desktop automatically. It doesn't. Claude Code now gets its own instructions rather than reusing Claude Desktop's. generate --create-missing-tracksno longer duplicates a track that's sitting right there. Reordering or rebuilding a set moved the track ids a project had remembered, the match missed, and Vibrai built a second copy alongside the original. It now finds a bound track by the name it saw, and writes the resolved ids back to the project file so the next run starts from the truth.vibrai uninstall --user <name>now removes that user's Claude Desktop entry and app data. Uninstall re-runs itself with elevated permissions when it needs to remove program files, and those two steps were reading the wrong home directory as a result — reporting success while leaving your files exactly where they were.- The first-song and genre-song wizards apply automation again, and tell you what landed. Moving automation out of
generateleft the wizards writing none of it, and saying nothing about it. - The session journal records the command that actually ran. Seven flags were being dropped from recorded assistant calls, leaving a shorter command that still looked plausible.
vibrai shellshows up invibrai --helpand in the published reference. It always worked — it was just invisible to everything that documents it.
All merged pull requests
What's Changed
- docs(marketing): name Vibrai in the V1 demo prompt (#397) by @gitizenme in cssllcio/Vibrai#569
- docs(marketing): copy-rewrite prompt library, guardrail-checked by @gitizenme in cssllcio/Vibrai#573
- docs: retire docs/user-guide.md, relocating what nothing else covered by @gitizenme in cssllcio/Vibrai#576
- docs: replace the guides' mechanical tables with a generated-reference pointer by @gitizenme in cssllcio/Vibrai#582
- docs: retire the two quickstarts, absorbed into docs.vibrai.com by @gitizenme in cssllcio/Vibrai#584
- test(docs): add validity gates for the user guides, and controls for the existing ones by @gitizenme in cssllcio/Vibrai#588
- feat(cli): register
shellas a real command so it reaches the catalogue by @gitizenme in cssllcio/Vibrai#591 - docs: CLAUDE.md said Done auto-closes issues; the workflow is disabled by @gitizenme in cssllcio/Vibrai#592
- docs(launch): T-5 runbook refresh, three stale-count fixes, and the server.json sync gate by @gitizenme in cssllcio/Vibrai#593
- --project defaults to the current directory name (#587) by @gitizenme in cssllcio/Vibrai#603
- feat(scale): honor a requested key/mode at generation time in one render by @gitizenme in cssllcio/Vibrai#601
- ci(release): remind the operator to delete the dry-run draft by @gitizenme in cssllcio/Vibrai#605
- docs(plan): v1.6.1 release spec + implementation plan by @gitizenme in cssllcio/Vibrai#581
- docs(plan): v1.6.1 absorbs #602; version rule waived for this release by @gitizenme in cssllcio/Vibrai#606
- Deploy Vibrai.mcpb to a findable path + discover the real Ableton User Library (#602) by @gitizenme in cssllcio/Vibrai#618
- docs(plan): v1.6.1 — #602 lands first, so Task 1 inverts by @gitizenme in cssllcio/Vibrai#620
- track auto-number: set Ableton's '#' numbering across the open set (#586) by @gitizenme in cssllcio/Vibrai#619
- docs(plan): v1.6.1 folds in #608 and #613 as Tasks 7 and 8 by @gitizenme in cssllcio/Vibrai#625
- docs(launch): T-3 status refresh, and a demo/release mismatch that blocks G1 by @gitizenme in cssllcio/Vibrai#624
- docs(plan): v1.6.1 Task 9 — live witness for #488 (fix already shipped as #511) by @gitizenme in cssllcio/Vibrai#631
- docs(launch): drop the key from the demo prompt, and defer G4 by @gitizenme in cssllcio/Vibrai#633
- docs(spec): drop the Board column from v1.6.1's scope table by @gitizenme in cssllcio/Vibrai#635
- feat(scale): derive chord degrees from the project's scale (mode-aware harmony) by @gitizenme in cssllcio/Vibrai#636
- docs: make the install guide true (#578, #577, #579) by @gitizenme in cssllcio/Vibrai#637
- Split automation out of generate into its own phase (#596) by @gitizenme in cssllcio/Vibrai#630
- CI: skip build/test/coverage when every changed path is inert (#632) by @gitizenme in cssllcio/Vibrai#638
- fix(soak): isolate SelfCheck test from xunit's parallel-collection noise by @gitizenme in cssllcio/Vibrai#640
- Cut GraphQL rate-limit cost of project-board lookups by ~30-100x by @gitizenme in cssllcio/Vibrai#644
- Verify the CI inert-path skip against real events (#639) by @gitizenme in cssllcio/Vibrai#641
- fix(ci): the inert allowlist skipped tests that read sessions/*.vibrai by @gitizenme in cssllcio/Vibrai#645
- fix(generate): --create-missing-tracks re-run semantics (#562, #563) by @gitizenme in cssllcio/Vibrai#643
- docs(plan): refresh v1.6.1 for the fifth scope wave (#626, #612, #611… by @gitizenme in cssllcio/Vibrai#646
- docs(plan): record v1.6.1 execution state, and correct Task 2's now-w… by @gitizenme in cssllcio/Vibrai#647
- docs(spec): generative music mode — Weighted generator + Evolve mode designs by @gitizenme in cssllcio/Vibrai#649
- docs(spec): refresh generative-mode specs against 2026-08-08 main (re-land) by @gitizenme in cssllcio/Vibrai#651
- Task3/harness gates by @gitizenme in cssllcio/Vibrai#650
- test(security): live witness that the M4L bridge binds loopback-only (#568) by @gitizenme in cssllcio/Vibrai#670
- test(m4l): cover the scenes falsy-req.body branch for real (#561) by @gitizenme in cssllcio/Vibrai#671
- fix(journal): key CliRenderMap on the MCP SDK's real wire names (#608) by @gitizenme in cssllcio/Vibrai#673
- docs(project-overview): record the generative-mode program and its milestone triage by @gitizenme in cssllcio/Vibrai#672
- fix(uninstall): honour --user for the Claude Desktop entry and app-data (#613) by @gitizenme in cssllcio/Vibrai#674
- test(devices): live witness for the audio-effect insert index (#488, #610) by @gitizenme in cssllcio/Vibrai#675
- test(automation): derive bounce values from each parameter's real range (#611) by @gitizenme in cssllcio/Vibrai#676
- test(automation): live witness for the device-class fallback success path (#627) by @gitizenme in cssllcio/Vibrai#677
- fix(wizards): apply automation and refresh bindings on the wizard render path (#626, #612) by @gitizenme in cssllcio/Vibrai#678
- docs(reviews): test-suite analysis report (2026-08-08, revised for v1.6.1) by @gitizenme in cssllcio/Vibrai#679
- docs(rules): exempt docs-only branches from the pre-PR coverage run by @gitizenme in cssllcio/Vibrai#680
- release: v1.6.1 by @gitizenme in cssllcio/Vibrai#719
Full Changelog: cssllcio/Vibrai@v1.6.0...v1.6.1