Download VibeCody release packages below. All binaries are built via GitHub Actions with SHA-256 checksums.
Quick install (Linux/macOS):
curl -fsSL https://raw.githubusercontent.com/TuringWorks/vibecody/main/install.sh | sh
v0.5.8 — Latest
Released: August 10, 2026 · Release notes · Changelog
The largest release so far — 410 commits since v0.5.7. Voice input on every client, SkillForge, the kodegraph code-graph substrate, goal-driven loops, a provider-agnostic embedding layer, and the VibeApp → VibeAIChat rename that brings VibeDesk in as a third desktop shell.
Highlights
- Voice input everywhere — one daemon route (
POST /voice/transcribe) and one shared React hook behind mic buttons in all three desktop shells, VibeMobile, and the VS Code / JetBrains / Neovim plugins. Groq Whisper with a local whisper.cpp fallback, so it works offline. - Choose your embedding model — semantic search and
@codebase:now run on Ollama, OpenAI (or any OpenAI-compatible endpoint), Voyage, Cohere, Gemini, or an in-process local model. Indexes are kept per-model, so switching is instant and switching back never re-embeds. See Embedding Models. - SkillForge — analyse and train agent-skill documents (SkillLens + SkillOpt) from a VibeCoder panel, the REPL, the TUI, and ten daemon routes.
- Code graph (kodegraph) — a tree-sitter → SQLite knowledge graph built in the background on daemon start, feeding a compact repo summary into the agent prompt in place of a flat directory tree.
- Goal-driven loops —
/loop goal <id>runs until a goal’ssuccess_criteriaverifiably hold, judged by a separate validator turn rather than the worker’s own opinion. - VibeDesk ships for the first time, alongside VibeCoder and VibeAIChat.
Notable fixes
- macOS artifacts can now be Developer ID signed end to end,
vibecliincluded — see Code signing to check what you downloaded. - The code index no longer writes API keys to disk; pre-existing indexes are migrated and the credential dropped.
- Switching embedding model used to return silently wrong results; indexes and memory rows now carry the model that produced them.
- VibeAIChat now autostarts the daemon like the other shells, and all three recover from a rotated bearer token instead of looping on 401.
- VibeCoder chat renders markdown — tables, headings, emphasis — instead of raw text.
- Theme tokens: two names referenced across 33 sites were never defined, so those borders and button fills never rendered.
VibeCLI — Terminal AI Assistant
| Platform | Download |
|---|---|
| macOS (Apple Silicon) | vibecli-aarch64-apple-darwin.tar.gz |
| Linux (arm64) | vibecli-aarch64-linux.tar.gz |
| Docker image (tarball) | vibecli-docker-v0.5.8.tar.gz |
| macOS (Intel) | vibecli-x86_64-apple-darwin.tar.gz |
| Linux (x86_64) | vibecli-x86_64-linux.tar.gz |
| Windows (x86_64) | vibecli-x86_64-windows.zip |
VibeCoder — Desktop Code Editor
| Platform | Download |
|---|---|
| macOS (Apple Silicon, .app) | VibeCoder-macOS-arm64.app.zip |
| macOS (Intel, .app) | VibeCoder-macOS-x64.app.zip |
| Linux (arm64, AppImage) | VibeCoder_0.5.8_aarch64.AppImage |
| macOS (Apple Silicon) | VibeCoder_0.5.8_aarch64.dmg |
| Linux (x86_64, AppImage) | VibeCoder_0.5.8_amd64.AppImage |
| Linux (x86_64, deb) | VibeCoder_0.5.8_amd64.deb |
| Linux (arm64, deb) | VibeCoder_0.5.8_arm64.deb |
| Windows (installer) | VibeCoder_0.5.8_x64-setup.exe |
| macOS (Intel) | VibeCoder_0.5.8_x64.dmg |
| Windows (MSI) | VibeCoder_0.5.8_x64_en-US.msi |
VibeAIChat — Desktop AI Assistant
| Platform | Download |
|---|---|
| Linux (arm64, AppImage) | VibeAIChat_0.5.8_aarch64.AppImage |
| macOS (Apple Silicon) | VibeAIChat_0.5.8_aarch64.dmg |
| Linux (x86_64, AppImage) | VibeAIChat_0.5.8_amd64.AppImage |
| Linux (x86_64, deb) | VibeAIChat_0.5.8_amd64.deb |
| Linux (arm64, deb) | VibeAIChat_0.5.8_arm64.deb |
| Windows (installer) | VibeAIChat_0.5.8_x64-setup.exe |
| macOS (Intel) | VibeAIChat_0.5.8_x64.dmg |
| Windows (MSI) | VibeAIChat_0.5.8_x64_en-US.msi |
VibeDesk — Desktop Task Shell
| Platform | Download |
|---|---|
| Linux (arm64, AppImage) | VibeDesk_0.5.8_aarch64.AppImage |
| macOS (Apple Silicon) | VibeDesk_0.5.8_aarch64.dmg |
| Linux (x86_64, AppImage) | VibeDesk_0.5.8_amd64.AppImage |
| Linux (x86_64, deb) | VibeDesk_0.5.8_amd64.deb |
| Linux (arm64, deb) | VibeDesk_0.5.8_arm64.deb |
| Windows (installer) | VibeDesk_0.5.8_x64-setup.exe |
| macOS (Intel) | VibeDesk_0.5.8_x64.dmg |
| Windows (MSI) | VibeDesk_0.5.8_x64_en-US.msi |
VibeMobile — Flutter Companion
| Platform | Download |
|---|---|
| Android (AAB) | VibeCody-Mobile-v0.5.8-android.aab |
| Android (APK) | VibeCody-Mobile-v0.5.8-android.apk |
| iOS (unsigned — sideload via AltStore / Sideloadly) | VibeCody-Mobile-v0.5.8-ios.ipa |
VibeWatch — Apple Watch & Wear OS
| Platform | Download |
|---|---|
| watchOS 10+ (unsigned — sideload via Xcode) | VibeCody-WatchOS-v0.5.8.app.zip |
| Wear OS 3+ (AAB) | VibeCody-Wear-v0.5.8.aab |
| Wear OS 3+ (APK) | VibeCody-Wear-v0.5.8.apk |
Code signing
v0.5.8 adds Developer ID signing to the whole macOS surface — including the
vibecli binary, which previously shipped with no signature at all.
Whether a specific download is signed depends on the build that produced it:
the release workflow signs only when the APPLE_CERT_P12_BASE64 secret is
configured, and falls back to ad-hoc (apps) or unsigned (CLI) with a workflow
notice otherwise. Rather than take this page’s word for it, check the artifact
you actually have:
codesign -dv --verbose=4 /Applications/VibeCoder.app
# expect: Authority=Developer ID Application: Ravindra Boddipalli (N7HV58M58W)
# a line reading "Signature=adhoc" means the artifact is NOT the signed release
codesign --verify --deep --strict --verbose=2 /Applications/VibeCoder.app
# expect: "valid on disk" and "satisfies its Designated Requirement"
The standalone vibecli binary in the macOS tarballs is signed with the same
identity:
codesign -dv --verbose=4 ./vibecli
Notarization status. Signing and notarization are separate steps. A signed but un-notarized app still shows the “unidentified developer” prompt on first launch — use right-click → Open, or strip the quarantine attribute as described below. Check whether a given build was notarized:
xcrun stapler validate /Applications/VibeCoder.app # "worked!" = notarized
spctl -a -vvv -t install /Applications/VibeCoder.app # "source=Notarized Developer ID"
Maintainers: see macOS code signing setup for the full credential list and the local build recipe.
v0.5.7
Released: May 29, 2026 · Release notes · Changelog
Previous release. VibeDesk is not listed: it did not exist yet in v0.5.7.
VibeCLI — Terminal AI Assistant
| Platform | Download |
|---|---|
| macOS (Apple Silicon) | vibecli-aarch64-apple-darwin.tar.gz |
| Linux (arm64) | vibecli-aarch64-linux.tar.gz |
| Docker image (tarball) | vibecli-docker-v0.5.7.tar.gz |
| macOS (Intel) | vibecli-x86_64-apple-darwin.tar.gz |
| Linux (x86_64) | vibecli-x86_64-linux.tar.gz |
| Windows (x86_64) | vibecli-x86_64-windows.zip |
VibeCoder — Desktop Code Editor
Shipped as VibeUI — the rename to VibeCoder landed after this release, so the filenames still say VibeUI.
| Platform | Download |
|---|---|
| macOS (Apple Silicon) | VibeUI-macOS-arm64.app.zip |
| macOS (Intel) | VibeUI-macOS-x64.app.zip |
| Linux (arm64, AppImage) | VibeUI_0.5.7_aarch64.AppImage |
| macOS (Apple Silicon) | VibeUI_0.5.7_aarch64.dmg |
| Linux (x86_64, AppImage) | VibeUI_0.5.7_amd64.AppImage |
| Linux (x86_64, deb) | VibeUI_0.5.7_amd64.deb |
| Linux (arm64, deb) | VibeUI_0.5.7_arm64.deb |
| Windows (installer) | VibeUI_0.5.7_x64-setup.exe |
| macOS (Intel) | VibeUI_0.5.7_x64.dmg |
| Windows (MSI) | VibeUI_0.5.7_x64_en-US.msi |
VibeAIChat — Desktop AI Assistant
Shipped as Vibe.App — renamed to VibeAIChat after this release.
| Platform | Download |
|---|---|
| Linux (arm64, AppImage) | Vibe.App_0.5.7_aarch64.AppImage |
| macOS (Apple Silicon) | Vibe.App_0.5.7_aarch64.dmg |
| Linux (x86_64, AppImage) | Vibe.App_0.5.7_amd64.AppImage |
| Linux (x86_64, deb) | Vibe.App_0.5.7_amd64.deb |
| Linux (arm64, deb) | Vibe.App_0.5.7_arm64.deb |
| Windows (installer) | Vibe.App_0.5.7_x64-setup.exe |
| macOS (Intel) | Vibe.App_0.5.7_x64.dmg |
| Windows (MSI) | Vibe.App_0.5.7_x64_en-US.msi |
VibeMobile — Flutter Companion
| Platform | Download |
|---|---|
| Android (AAB) | VibeCody-Mobile-v0.5.7-android.aab |
| Android (APK) | VibeCody-Mobile-v0.5.7-android.apk |
| iOS (unsigned — sideload via AltStore / Sideloadly) | VibeCody-Mobile-v0.5.7-ios.ipa |
VibeWatch — Apple Watch & Wear OS
| Platform | Download |
|---|---|
| watchOS 10+ (unsigned — sideload via Xcode) | VibeCody-WatchOS-v0.5.7.app.zip |
| Wear OS 3+ (AAB) | VibeCody-Wear-v0.5.7.aab |
| Wear OS 3+ (APK) | VibeCody-Wear-v0.5.7.apk |
Installing on macOS
Applies to every release; not specific to the version above.
macOS install: the app is killed on first launch
Symptom. The app bounces once in the Dock and quits, or Finder says “«App» is damaged and can’t be opened. You should move it to the Trash.”
It is not damaged, and re-downloading will not help. Every macOS artifact
built by CI is ad-hoc signed with the hardened runtime enabled, because the
release workflow has no Developer ID certificate (APPLE_CERT_P12_BASE64 is
unset — see macOS code signing setup).
macOS refuses to run that combination while the download-quarantine flag is set,
and it does so by killing the process — verified: the binary exits with
signal 9 (exit=137) while quarantined, and starts normally the moment the flag
is removed.
Fix — remove the quarantine flag:
xattr -dr com.apple.quarantine /Applications/VibeCoder.app
xattr -dr com.apple.quarantine /Applications/VibeAIChat.app
xattr -dr com.apple.quarantine /Applications/VibeDesk.app
Run it once per app, after moving it to /Applications. That is the whole fix;
the app launches immediately afterwards.
Why not “right-click → Open”? That is the standard advice for an
unidentified developer prompt, and it is what this page used to recommend
first. It does not reliably clear this state: the hardened runtime turns the
Gatekeeper rejection into a kill rather than a prompt, so there is often no
“Open anyway” dialog to click. Use the xattr command.
spctl will still report rejected afterwards. That is expected — it means
“not Developer ID signed”, and it stops mattering once the quarantine flag is
gone, because Gatekeeper only assesses quarantined files.
The real fix is on the maintainer side: configure the signing secrets below so releases ship Developer ID signed and notarized, at which point none of this is necessary for anyone.
macOS code signing setup (for maintainers)
One-shot setup: run scripts/setup-apple-signing.sh
on a Mac that already has the Developer ID certificate installed. It picks the
identity, derives the Team ID from it, verifies the exported .p12 actually
contains a private key, checks the notarization credentials against Apple
before uploading anything, and then sets all six secrets with gh. Nothing
leaves the machine except the encrypted secrets themselves.
Coverage. These six secrets sign and notarize VibeCoder, VibeAIChat,
VibeDesk and vibecli. A bare binary cannot carry a stapled ticket
(stapling only works for .app/.dmg/.pkg), so vibecli’s ticket is fetched
from Apple on first run — but it is notarized, which is what Gatekeeper checks.
iOS and watchOS are a separate, optional phase — and they need a different certificate. Developer ID signs macOS apps distributed outside the App Store and cannot sign an iOS or watchOS bundle at all; those need Apple Distribution. The script uploads each to its own secret so every job imports the identity it can actually use:
| Secret | Certificate | Used by |
|---|---|---|
APPLE_CERT_P12_BASE64 |
Developer ID Application | VibeCoder, VibeAIChat, VibeDesk, vibecli |
APPLE_DIST_CERT_P12_BASE64 |
Apple Distribution | VibeMobile (iOS), VibeCodyWatch |
On top of the certificate, each mobile target needs a distribution provisioning profile for its App ID:
| Platform | App ID | Secret |
|---|---|---|
| iOS | dev.vibecody.vibecodyMobile |
APPLE_IOS_PROFILE_BASE64 |
| watchOS | com.turingworks.vibecody.watch |
APPLE_PROVISIONING_PROFILE_BASE64 |
Each is gated independently — missing secrets mean that platform ships unsigned (and still sideloadable), never a failed release:
| Secrets present | Result |
|---|---|
| none | iOS/watchOS unsigned, as before |
| + distribution cert + profile | signed artifact |
+ APPLE_ASC_* |
watchOS also pushed to TestFlight |
Android ships unsigned by design, for sideloading.
Each desktop job now verifies its own .app after building and fails the
release if it is still ad-hoc — the check vibecli always had and the app
bundles never did, which is why ad-hoc builds shipped unnoticed.
APPLE_KEYCHAIN_PASSWORD is not required — the workflow generates a
throwaway password per job for a keychain that never outlives it.
The manual equivalent is below.
If Keychain Access greys out the .p12 option, you do not need it — the
script exports via the security CLI, which only asks for your keychain
password. The greying is usually one of:
| Cause | Fix |
|---|---|
| Viewing the Certificates category | Switch to My Certificates — only that view shows identities (certificate plus private key) |
| Selected the certificate, not the identity | Click the disclosure triangle so the certificate and its key are selected together |
| Several items selected at once | Select exactly one |
| Private key is non-extractable | Nothing can export it. Issue a new Developer ID certificate — generate the CSR from Keychain Access (Certificate Assistant → Request a Certificate from a Certificate Authority), which produces an extractable key |
The script exports every identity, keeps only the one being used (matching the
certificate to its private key by public modulus, since order is not
guaranteed), and rebuilds a .p12 with a single private key. Other
certificates travel as chain material only — public data, no keys.
To ship fully Apple-notarized builds (no first-launch warning at all), add the following repository secrets:
| Secret | What it is |
|---|---|
APPLE_TEAM_ID |
Your 10-char Apple Developer Team ID |
APPLE_SIGNING_IDENTITY |
Full identity string, e.g. Developer ID Application: Acme Inc (TEAMID) |
APPLE_CERT_P12_BASE64 |
base64 -i DeveloperID.p12 of your exported Developer ID Application certificate |
APPLE_CERT_P12_PASSWORD |
Password for the .p12 |
APPLE_KEYCHAIN_PASSWORD |
Any random string — used to lock the throwaway runner keychain |
APPLE_ID |
Your Apple ID email (for notarization) |
APPLE_APP_SPECIFIC_PASSWORD |
App-specific password generated at appleid.apple.com (NOT your regular Apple ID password) |
As of v0.5.8 none of these secrets are configured on the repository, so a tag push produces ad-hoc app bundles and an unsigned vibecli. Confirm before cutting a release you intend to be signed:
gh api repos/TuringWorks/vibecody/actions/secrets --jq '.secrets[].name'
Upload them with gh secret set NAME (the .p12 export and its password come from Keychain Access → export the Developer ID Application identity).
The build-cli, build-vibecoder, build-vibeaichat and build-vibedesk jobs auto-detect these secrets — when APPLE_CERT_P12_BASE64 is unset, the build emits a workflow ::notice:: and falls back to ad-hoc signing. The watchOS-signed track uses a parallel set of secrets (APPLE_PROVISIONING_PROFILE_BASE64 + App Store Connect API key) — see .github/workflows/release.yml build-watchos-signed for that path.
VibeDesk ships from v0.5.8. It has a
build-vibedeskrelease job (same five-platform matrix and dual-mode signing as the other two shells) and avibedesk-checksCI job; it was absent from v0.5.7 and earlier. Two things to know about it:
- It is not in the
releasejob’s criticalif:gate yet. The job has never run on Linux or Windows, so a failure there must not block the whole release. Promote it by addingneeds.build-vibedesk.result == 'success'once it has shipped green.Its
src-tauriembeds the wholevibeclicrate for direct ProfileStore access — exactly as VibeCoder does — so its build cost tracks VibeCoder’s. On macOS that includes the Metal mistral.rs backend, whichvibeclipulls unconditionally through a[target.'cfg(target_os = "macos")']block regardless of feature flags.As of v0.5.8 all three shells carry that cost: VibeAIChat took the
vibeclidependency too, so it can autostart the daemon through the shareddaemon_bootstrapinstead of having no way to start one. It previously embedded no Rust of its own and built in a fraction of the time.
Signing and notarizing locally
CI is not required — a local make build-ui will sign and notarize once the same variables are in your environment. Two prerequisites:
- The Developer ID Application certificate must be in your login keychain. The
APPLE_CERT_P12_BASE64secret is a CI-only mechanism for importing it into a throwaway runner keychain; locally you install the cert once from your Apple Developer account. Confirm it is there:security find-identity -v -p codesigning | grep "Developer ID Application" APPLE_PASSWORDmust be an app-specific password, generated at appleid.apple.com → Sign-In and Security → App-Specific Passwords. Your normal Apple ID password is rejected.
Then export the four variables and build:
export APPLE_SIGNING_IDENTITY="Developer ID Application: Acme Inc (TEAMID)"
export APPLE_TEAM_ID="XXXXXXXXXX"
export APPLE_ID="you@example.com"
export APPLE_PASSWORD="xxxx-xxxx-xxxx-xxxx" # app-specific, not your Apple ID password
make build-ui
APPLE_SIGNING_IDENTITY overrides the "signingIdentity": "-" in tauri.conf.json, so the committed config stays ad-hoc and no one needs a certificate for an ordinary development build. Leave the variable unset and you get today’s behaviour.
Notarization is a round trip to Apple’s servers — budget 2–15 minutes per build on top of compile time. If you only want a runnable app, skip it; the warning in the build log (skipping app notarization…) is informational, not an error.
Verify the result:
codesign -dv --verbose=4 target/release/bundle/macos/VibeCoder.app # expect your Developer ID, not "adhoc"
xcrun stapler validate target/release/bundle/macos/VibeCoder.app # expect "The validate action worked!"
spctl -a -vvv -t install target/release/bundle/macos/VibeCoder.app # expect "accepted / source=Notarized Developer ID"
Building all three shells locally keeps only the last DMG
The three Tauri shells share the workspace target dir, and Tauri clears
target/release/bundle/dmg/ before writing its own image. Build them in
sequence and you get three DMGs built, three DMGs signed — and one DMG on
disk. The .app bundles live in a sibling directory and all three survive,
which is what makes the loss easy to miss: the build log reports every DMG
created and signed, and checking the apps shows all three present.
make build-apps stages each shell’s bundles into dist/ before the next
build clears them. If you drive tauri build by hand, copy the DMG out
between shells.
CI is unaffected: each shell builds on its own runner with its own target dir.
Related: tauri build --bundles dmg deletes the .app after bundling it, so
re-running it for one shell removes that shell’s app bundle. The app is inside
the DMG; mount it if you need the bundle back.
DMG bundling fails with error running bundle_dmg.sh
bundle_dmg.sh drives Finder over AppleScript to position icons and set the window background. When that osascript call fails the script exits 64, and Tauri reports only failed to run …/bundle_dmg.sh — the underlying reason is not surfaced.
The reliable fix is to skip the AppleScript, which Tauri does when it is told it is running in CI:
CI=true make build-ui # note: CI=true, not CI=1
Tauri binds the CI environment variable to its own --ci flag, which accepts only true or false — CI=1 fails immediately with error: invalid value '1' for '--ci'. With CI=true the bundler passes --skip-jenkins, the osascript call never happens, and the DMG builds. You lose only the cosmetics: custom window size, icon positions and background image. Drag-to-Applications still works, because the Applications symlink is created before the AppleScript runs.
This was verified on a machine where the styled path failed twice and CI=true succeeded immediately.
Other things worth checking:
- A leaked scratch volume. A failed run leaves its disk image mounted, which breaks every retry with a confusing second error. Always clean up before rebuilding:
ls -d /Volumes/dmg.* # any match is a leftover hdiutil detach /Volumes/dmg.XXXXXX rm -f target/release/bundle/macos/rw.*.dmg - Automation permission, if you want the styled DMG: System Settings → Privacy & Security → Automation → your terminal app → enable Finder. A previous “Don’t Allow” is remembered and must be re-enabled here. Note this is per-app, and the process that actually sends the Apple event is
node/osascriptunder your shell — a grant for one terminal does not cover a build launched from another. - The
-1728“Can’t get disk” race.bundle_dmg.shguards it with a fixed 2-second sleep after mounting, which is not always enough on a machine that has just finished a heavy LTO link. Running the same script standalone on an idle machine can succeed where it failed under the build — so an intermittent failure here does not mean your permissions changed. - No GUI session at all (SSH, a headless runner): there is no Finder to talk to, so
CI=trueis the only option.
Verify Downloads
# Download the checksums file
curl -LO https://github.com/TuringWorks/vibecody/releases/download/v0.5.8/SHA256SUMS.txt
# Verify
sha256sum -c SHA256SUMS.txt
Release History
For older releases (v0.5.6 and earlier), see github.com/TuringWorks/vibecody/releases.