Building
March 4, 2026 · View on GitHub
Prerequisites
Linux:
Based on tauri/prerequisites/#setting-up-linux
sudo apt-get update
sudo apt-get install -y pkg-config build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev clang cmake libssl-dev libasound2-dev
macOS:
Make sure to install XCode from the AppStore and open it once so it will download essential macOS libraries.
Build
Run the pre-build script (downloads the sona sidecar binary and sets up platform deps):
uv run scripts/pre_build.py
Install frontend dependencies from desktop folder:
cd desktop
pnpm install
Start dev mode:
pnpm exec tauri dev
Or build for production:
pnpm exec tauri build
You can also do it all in one step:
uv run scripts/pre_build.py --dev # or --build
Build sona locally (dev)
Download prebuilt whisper.cpp libs (one-time):
uv run sona/scripts/download-libs.py
Windows only — install MSYS2, then install MinGW and Vulkan headers:
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-vulkan-devel
Open an MSYS2 MinGW64 shell with your full Windows PATH (so go, rustc, etc. are available):
C:\msys64\msys2_shell.cmd -mingw64 -defterm -no-start -use-full-path
Then build sona and place it as sidecar (from desktop/):
# macOS/Linux
CGO_ENABLED=1 go build -C ../sona -o ../desktop/src-tauri/binaries/sona-$(rustc -vV | awk '/host:/ {print \$2}') ./cmd/sona
# Windows
CGO_ENABLED=1 go build -C ../sona -o ../desktop/src-tauri/binaries/sona-$(rustc -vV | awk '/host:/ {print \$2}').exe ./cmd/sona
Then copy the binary into the dev target so tauri dev picks it up immediately:
cp desktop/src-tauri/binaries/sona-$(rustc -vV | awk '/host:/ {print \$2}') target/debug/sona
Test
export RUST_LOG=trace
cargo test -- --nocapture
Lint
cargo fmt
cargo clippy
Create new release
- Increment version in
tauri.conf.jsonand commit - Run the Release workflow from GitHub Actions (workflow_dispatch)
It will create releases for Windows, Linux, and macOS
Along with latest.json file (used for auto updater).
When Release action finishes, it will run Deploy landing action
and update downloads links in landing page.
Landing
Compress images
pnpx tinypng-go static/*.png
Convert markdown to PDF
go install github.com/mandolyte/mdtopdf/cmd/md2pdf@latest
md2pdf -i website/public/privacy_policy.md -o website/public/privacy_policy.pdf
Normalize wav file for tests
ffmpeg -i file.wav -ar 16000 -ac 1 -c:a pcm_s16le normal.wav
Edit PR before merge
- Install gh cli
gh pr checkout <url>
git push <fork url>
Update packages
pnpm install
pnpx ncu -u
cd src-tauri
cargo install cargo-edit
rm -rf ../Cargo.lock
CARGO_NET_GIT_FETCH_WITH_CLI=true cargo upgrade
# OR
cargo +nightly -Zunstable-options update --breaking
Clear Github actions cache
gh cache delete -a
Notes
- Always update crates and lock in specific commit so it will be easy to revert!!
- Don't upgrade important crates such as tauri as long as it stable and works and there's no real need!!
Windows Code Signing
Install Windows SDK:
winget install -e --id Microsoft.WindowsSDK.10.0.26100
Generate a self-signed certificate (valid 10 years):
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3650 -nodes -subj "/CN=Vibe" -addext "extendedKeyUsage=codeSigning"
openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem -password pass:YOUR_PASSWORD
base64 -i cert.pfx
Copy the base64 output and update GitHub secrets:
WINDOWS_CERTIFICATE— the base64 outputWINDOWS_CERTIFICATE_PASSWORD— the password used above
Then delete the local files:
rm key.pem cert.pem cert.pfx
Analytics (Optional)
Vibe uses Aptabase for analytics. Not required for development. To enable, set these env vars at build time:
export APTABASE_APP_KEY="A-..."
export APTABASE_BASE_URL="https://..."
Gotchas
Build faster in dev mode (useful in Windows)
rustup nightly install
rustup component add rustc-codegen-cranelift-preview --toolchain nightly
# Unix
CARGO_PROFILE_DEV_CODEGEN_BACKEND="cranelift" cargo +nightly build -Zcodegen-backend
# Powershell
$env:CARGO_PROFILE_DEV_CODEGEN_BACKEND="cranelift" ; cargo +nightly build -Zcodegen-backend