Offline dictation and transcription for Apple Silicon Macs.
Offline dictation and transcription for Mac: local Whisper, Parakeet and Qwen speech-to-text, tuned for Apple Silicon. Scripts and coding agents get an OpenAI-compatible local API: POST /v1/audio/transcriptions.
Press Control + Command + N, speak, press it again: Vella transcribes on your Mac and pastes the text where you were typing. In Streaming mode the words appear as you speak. Audio and text stay on the Mac.
brew install --cask tobynoskillson/tap/vellaApple Silicon, macOS 26 or newer. No Xcode, Python or developer account. Without Homebrew, one curl command.
Models · Install · Using it · For your agent · Privacy · User guide · Website · Sponsor
Seven open models; nothing downloads until you choose Get. Four starting points:
Measured 1–2 October 2026; Whisper refreshed 2026-10-03 on Apple M5 Max, macOS 26.6. English WER on the 167 English minutes of v2 (239.7 min total); nine other languages scored separately. Speed, energy and peak RAM: v2-quick (22.5 min).
| Model | Use it for | Tier / path | English WER % | Speed | J / audio min | Peak RAM MB |
|---|---|---|---|---|---|---|
| Parakeet v3 Ultra | Dictation in 25 European languages | bf16 · Optimized Fast | 15.51 | 507.1× | 4.58 | 1792 |
| Whisper large-v3 turbo | About 100 languages, faster Whisper | fp16 · Optimized Fast | 16.57 | 115.7× | 36.56 | 2516 |
| Whisper large-v3 | About 100 languages | fp16 · Optimized Fast | 17.06 | 34.9× | 82.41 | 3916 |
| Qwen3 ASR 1.7B | 30 languages, including Chinese, Japanese and Korean | bf16 · Optimized Fast | 15.00 | 29.6× | 72.73 | 5118 |
Every model runs Vella's optimized kernels where your Mac supports them and falls back to plain MLX by itself. Measurements are from an M5 Max with a 40-core GPU; on other Macs the table shows those speed and energy figures for reference, marked with a triangle.
Parakeet v3 Ultra is Moondream's post-training of NVIDIA Parakeet v3 (CC BY 4.0), converted to MLX by selcukkubur/parakeet-ultra-mlx. Publishers, source models, MLX converters and licences for every model are in THIRD_PARTY_NOTICES.md.
Each model downloads one pinned checkpoint at its published 16-bit precision, except Parakeet v3, whose pinned source is FP32 (2.51 GB) and which Vella converts once to BF16 when you choose Get. int8 and int4 are made on your Mac from the 16-bit weights; the download prompt names the exact size first. The table shows the dtype actually running (bf16/fp16, int8, int4), the precision recommended for your Mac in gold (the smallest that keeps 16-bit accuracy and runs on its GPU's matrix hardware), and a triangle on precisions your Mac runs in software. An Exact/Fast switch chooses the recipe. Missing figures show —, never a sibling model's score. Models and weights retain their own licences in Resources/models.json.
Every model and precision: word error rate, speed, energy, Peak RAM
Measured 2026-10-01, 2026-10-03 on Apple M5 Max, macOS 26.6. English WER on the 167 English minutes of v2 (239.7 min total); nine other languages scored separately; speed, energy and peak RAM: v2-quick (22.5 min). Languages are supported benchmark languages, out of 9.
Standard is plain MLX, the path a model falls back to; Optimized adds custom kernels and is what Vella runs. Whisper Standard runs faithful fp16. Whisper Exact and Fast share the same exact-only whisper-4 recipe and canonical measurement. Whisper Standard and Optimized were measured together on the faithful build; their per-cell and tier gates use that build’s fp16 Standard baseline. Other families retain their dated release measurements.
| Model | Mode | Precision | Path | English WER % | Format % | Languages | Speed | J / min | Peak RAM | Suite |
|---|---|---|---|---|---|---|---|---|---|---|
| Parakeet v3 Ultra | Dictation | bf16 | Standard | 15.46 | 5.80 | 5/9 | 261.4× | 6.33 | 1,796 MB | v2 |
| Parakeet v3 Ultra | Dictation | bf16 | Optimized · Exact | 15.49 | 5.74 | 5/9 | 474.5× | 4.71 | 1,808 MB | v2 |
| Parakeet v3 Ultra | Dictation | bf16 | Optimized · Fast | 15.51 | 5.79 | 5/9 | 507.1× | 4.58 | 1,792 MB | v2 |
| Parakeet v3 Ultra | Dictation | int8 | Standard | 15.46 | 5.76 | 5/9 | 244.8× | 8.99 | 1,280 MB | v2 |
| Parakeet v3 Ultra | Dictation | int8 | Optimized · Exact | 15.46 | 5.77 | 5/9 | 369.0× | 8.62 | 1,888 MB | v2 |
| Parakeet v3 Ultra | Dictation | int8 | Optimized · Fast | 15.46 | 5.81 | 5/9 | 515.0× | 5.35 | 1,352 MB | v2 |
| Parakeet v3 Ultra | Dictation | int4 | Standard | 15.62 | 5.81 | 5/9 | 246.7× | 8.75 | 1,024 MB | v2 |
| Parakeet v3 Ultra | Dictation | int4 | Optimized · Exact | 15.65 | 5.84 | 5/9 | 370.6× | 8.41 | 1,640 MB | v2 |
| Parakeet v3 Ultra | Dictation | int4 | Optimized · Fast | 15.58 | 5.80 | 5/9 | 522.5× | 5.13 | 1,094 MB | v2 |
| Parakeet v3 | Dictation | bf16 | Standard | 16.37 | 7.84 | 5/9 | 257.7× | 6.35 | 1,794 MB | v2 |
| Parakeet v3 | Dictation | bf16 | Optimized · Exact | 16.42 | 7.92 | 5/9 | 463.9× | 4.81 | 1,777 MB | v2 |
| Parakeet v3 | Dictation | bf16 | Optimized · Fast | 16.42 | 7.92 | 5/9 | 494.3× | 4.70 | 1,765 MB | v2 |
| Parakeet v3 | Dictation | int8 | Standard | 16.40 | 7.92 | 5/9 | 241.2× | 9.05 | 1,279 MB | v2 |
| Parakeet v3 | Dictation | int8 | Optimized · Exact | 16.35 | 7.81 | 5/9 | 363.3× | 8.68 | 1,883 MB | v2 |
| Parakeet v3 | Dictation | int8 | Optimized · Fast | 16.30 | 7.85 | 5/9 | 504.4× | 5.41 | 1,342 MB | v2 |
| Parakeet v3 | Dictation | int4 | Standard | 17.02 | 7.68 | 5/9 | 242.3× | 8.84 | 1,024 MB | v2 |
| Parakeet v3 | Dictation | int4 | Optimized · Exact | 16.90 | 7.69 | 5/9 | 365.0× | 8.49 | 1,628 MB | v2 |
| Parakeet v3 | Dictation | int4 | Optimized · Fast | 16.95 | 7.69 | 5/9 | 512.3× | 5.20 | 1,088 MB | v2 |
| Qwen3 ASR 1.7B | Dictation | bf16 | Standard | 15.00 | 6.67 | 9/9 | 26.6× | 81.03 | 4,624 MB | v2 |
| Qwen3 ASR 1.7B | Dictation | bf16 | Optimized (Exact = Fast) | 15.00 | 6.67 | 9/9 | 29.6× | 72.73 | 5,118 MB | v2 |
| Qwen3 ASR 1.7B | Dictation | int8 | Standard | 15.11 | 6.59 | 9/9 | 36.7× | 71.35 | 3,197 MB | v2 |
| Qwen3 ASR 1.7B | Dictation | int8 | Optimized (Exact = Fast) | 15.11 | 6.59 | 9/9 | 44.3× | 64.81 | 3,721 MB | v2 |
| Qwen3 ASR 1.7B | Dictation | int4 | Standard | 18.32 | 7.03 | 9/9 | 47.3× | 56.23 | 2,367 MB | v2 |
| Qwen3 ASR 1.7B | Dictation | int4 | Optimized (Exact = Fast) | 18.32 | 7.03 | 9/9 | 61.5× | 51.43 | 2,890 MB | v2 |
| Qwen3 ASR 0.6B | Dictation | bf16 | Standard | 15.89 | 7.16 | 9/9 | 51.7× | 36.82 | 2,142 MB | v2 |
| Qwen3 ASR 0.6B | Dictation | bf16 | Optimized (Exact = Fast) | 15.89 | 7.16 | 9/9 | 64.4× | 34.07 | 2,406 MB | v2 |
| Qwen3 ASR 0.6B | Dictation | int8 | Standard | 16.04 | 7.17 | 9/9 | 60.7× | 33.58 | 1,639 MB | v2 |
| Qwen3 ASR 0.6B | Dictation | int8 | Optimized (Exact = Fast) | 16.04 | 7.17 | 9/9 | 82.0× | 30.05 | 1,920 MB | v2 |
| Qwen3 ASR 0.6B | Dictation | int4 | Standard | 17.56 | 8.25 | 9/9 | 68.4× | 28.71 | 1,332 MB | v2 |
| Qwen3 ASR 0.6B | Dictation | int4 | Optimized (Exact = Fast) | 17.56 | 8.25 | 9/9 | 96.4× | 25.60 | 1,648 MB | v2 |
| Whisper large-v3 | Dictation | fp16 | Standard | 17.06 | 8.17 | 9/9 | 29.5× | 86.34 | 3,923 MB | v2 |
| Whisper large-v3 | Dictation | fp16 | Optimized (Exact = Fast) | 17.06 | 8.17 | 9/9 | 34.9× | 82.41 | 3,916 MB | v2 |
| Whisper large-v3 | Dictation | int8 | Standard | 17.27 | 8.18 | 9/9 | 34.0× | 80.65 | 3,141 MB | v2 |
| Whisper large-v3 | Dictation | int8 | Optimized (Exact = Fast) | 17.27 | 8.18 | 9/9 | 43.5× | 73.70 | 3,116 MB | v2 |
| Whisper large-v3 | Dictation | int4 | Standard | 17.10 | 8.17 | 9/9 | 40.4× | 73.16 | 2,102 MB | v2 |
| Whisper large-v3 | Dictation | int4 | Optimized (Exact = Fast) | 17.10 | 8.17 | 9/9 | 54.4× | 65.96 | 2,097 MB | v2 |
| Whisper large-v3 turbo | Dictation | fp16 | Standard | 16.57 | 7.43 | 9/9 | 83.9× | 38.22 | 2,499 MB | v2 |
| Whisper large-v3 turbo | Dictation | fp16 | Optimized (Exact = Fast) | 16.57 | 7.43 | 9/9 | 115.7× | 36.56 | 2,516 MB | v2 |
| Whisper large-v3 turbo | Dictation | int8 | Standard | 16.52 | 7.46 | 9/9 | 91.5× | 37.06 | 2,419 MB | v2 |
| Whisper large-v3 turbo | Dictation | int8 | Optimized (Exact = Fast) | 16.52 | 7.46 | 9/9 | 129.8× | 34.64 | 2,363 MB | v2 |
| Whisper large-v3 turbo | Dictation | int4 | Standard | 16.96 | 8.14 | 9/9 | 93.8× | 39.81 | 1,723 MB | v2 |
| Whisper large-v3 turbo | Dictation | int4 | Optimized (Exact = Fast) | 16.96 | 8.14 | 9/9 | 134.6× | 37.27 | 1,731 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | bf16 | Standard | 23.39 | 10.57 | 9/9 | 7.3× | 188.25 | 2,253 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | bf16 | Optimized · Exact | 23.39 | 10.57 | 9/9 | 19.3× | 80.33 | 2,725 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | bf16 | Optimized · Fast | 23.35 | 10.58 | 9/9 | 34.9× | 50.03 | 1,655 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | int8 | Standard | 23.42 | 10.54 | 9/9 | 15.1× | 112.00 | 1,191 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | int8 | Optimized · Exact | 23.42 | 10.54 | 9/9 | 29.8× | 58.71 | 1,251 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | int8 | Optimized · Fast | 23.44 | 10.55 | 9/9 | 38.4× | 43.07 | 1,114 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | int4 | Standard | 32.78 | 16.20 | 9/9 | 15.3× | 110.17 | 927 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | int4 | Optimized · Exact | 32.78 | 16.20 | 9/9 | 30.4× | 55.57 | 980 MB | v2 |
| Nemotron 3.5 Streaming | Streaming | int4 | Optimized · Fast | 32.80 | 16.18 | 9/9 | 39.7× | 39.77 | 847 MB | v2 |
| ElevenLabs Scribe v2 (cloud API) | Dictation | — | — | ~13.4 (estimated, 11.8–13.9) | — | — | — | — | — | estimated |
| Microsoft Azure Speech (cloud API) | Dictation | — | — | ~12.9 (estimated, 11.3–13.3) | — | — | — | — | — | estimated |
Offered with their measured figures but never recommended, because against 16-bit they lost test clips or language accuracy: Parakeet v3 4 Standard (2 test clips came back empty or cut short); Parakeet v3 4 Optimized · Exact (3 test clips came back empty or cut short); Parakeet v3 4 Optimized · Fast (3 test clips came back empty or cut short); Qwen3 ASR 1.7B 8 (1 test clip came back empty or cut short, Turkish +42.64 pt); Qwen3 ASR 1.7B 4 (1 test clip came back empty or cut short); Qwen3 ASR 0.6B 4 (2 test clips came back empty or cut short); Whisper large-v3 4 (2 test clips came back empty or cut short); Whisper large-v3 turbo 4 (1 test clip came back empty or cut short); Nemotron 3.5 Streaming 4 Standard (21 test clips came back empty or cut short, English WER +9.40 pt, multilingual mean +8.89 pt, Swedish +13.33 pt, Polish +13.15 pt, Turkish +12.29 pt, Chinese +10.99 pt, Japanese +10.34 pt); Nemotron 3.5 Streaming 4 Optimized · Exact (21 test clips came back empty or cut short, English WER +9.40 pt, multilingual mean +8.89 pt, Swedish +13.33 pt, Polish +13.15 pt, Turkish +12.29 pt, Chinese +10.99 pt, Japanese +10.34 pt); Nemotron 3.5 Streaming 4 Optimized · Fast (21 test clips came back empty or cut short, English WER +9.41 pt, multilingual mean +8.88 pt, Swedish +13.33 pt, Polish +13.15 pt, Turkish +12.29 pt, Chinese +10.70 pt, Japanese +10.46 pt).
Cloud rows are estimates, not measurements; no audio was sent to them. They retain their dated 26 Sep scaling anchors, not final-build model measurements. Sources, ranges and arithmetic are in references in Resources/benchmarks.json.
Build provenance (3 October 2026): measured build deb8845, built from 6eed904, worker SHA-256 8a215e827e5972ef9afb4db7cf57ea8f068006f40ef1510ccd66e6977546b99d, tag full-8a215e827e59. Shipped source trees: Worker ad99ab6dfd1d039e01ac31012cbc7d08c458fd0c, Packages 6851d8c101f507aea8980af93fd877aa0e84a20c (commit 9aad75cbac72dbc650669fe227fc273414db6c63 is informational). The earlier Worker documentation delta from measured defaults was Worker/Sources/MLXAudioSTT/NemotronASR/README.md, Worker/Sources/MLXAudioSTT/Parakeet/README.md, Worker/Sources/MLXAudioSTT/Qwen3ASR/README.md, Worker/Sources/MLXAudioSTT/Whisper/README.md, all excluded from the package. A subsequent chip-safety delta adds the macOS 26.2 tensor preflight, GPU architecture/name in gate keys and verdict metadata, Parakeet availability guards, and CPU regression tests. Kernels, tile plans and deadlines are unchanged; old verdicts requalify once per model/recipe. The measured-defaults bridge in the linked JSON predates this safety delta. Pinned build-script SHA-256 baa879823b5157546f0ce6912de8fe9b670af29e664cf5b23bdf2bbe9173149b; CI artifact worker SHA-256 (filled at publish, never from a local candidate): 613c911562efa5379bcd02ed78b126e5867290659e5151ab9f61185e49711252. The Resources/benchmarks.json builds block records measured and shipped identities and the scoped bridge. Kept levers are on by default: Exact runs exact-only components, Fast runs all kept components, Standard runs none. Whisper Fast passed the recorded token-identity check (six cells, each 122/122 public clips). 5 Oct: Swift 6.4 source builds. Worker/build-split.sh weak-links swift_initBorrow (referenced by swift-collections code that only Swift 6.4 compiles and nothing calls) when the compiler is Swift 6.4 or newer, and the build.sh runtime-symbol guard rejects only strong borrow references. With the release compiler, Swift 6.3.3, the build commands and flags are unchanged. 4 Oct: build.sh identity, existing-signature and runtime-symbol probes drain producer output under pipefail; failed signature/symbol inspection now refuses the build. The measured build used the old build.sh text. Compilation is unchanged: compiler, flags, build commands, workers and shader inputs are unchanged. Earlier shipped build-script pins were 494137a7f64e14c4a621618ab8fd2fd68cdb370ab82bdad16d60ac78f75ee48e (before Swift 6.4 support), 1862cec695156417ab3518e58b95ab61f491f8c59e867c4709ee68c9024dfc90 (before pipefail repair) and 025547b32840d30e6b1065dcd8322640a0bdcf9d6f972d5c09bfd5b47b76b56b (before producer-error hardening). Faithful Whisper refresh: source a142fd4612e330cb073fa8cd797e02bd8c5dc3df, worker SHA-256 b49faa52236c39ab210c3a11d993b396517b8483a1859953acccdd7af68bf119; Standard and shared Exact/Fast measured in the same window.
Nemotron streaming gates: layout_artifact. Every gated cell compares with native Standard using identical session/shard order and endpoint gap. Standard accuracy uses the same-layout control when present; speed and energy retain their dated measurements. Missing same-layout Standard means not gated, not a pass or fail.
Commit SHAs are those of the published history (rewritten 3 Oct to remove the withdrawn comparison); the measured build’s source tree is identical.
-
Precision is the running weight format: bf16 or fp16 for the 16-bit checkpoint, and int8 or int4 for affine quantization made on your Mac. Parakeet v3’s fp32 download is converted once to bf16 at Get. Every precision runs the optimized path and falls back to plain MLX by itself; Exact and Fast are its two recipes.
-
WER is English word error rate on the 167 English minutes of the 239.7-minute v2 suite: the percentage of words wrong (substituted, missed or added) out of the words spoken, ignoring case and punctuation. The nine other languages are scored separately and never pooled into this figure. It is the industry-standard metric, as on the Hugging Face Open ASR Leaderboard; our v2 set is hard (meetings, far-field microphones, accents, earnings calls), so rates run higher than on public leaderboards. Format is our own measure, with no industry standard: character error rate with case and punctuation kept, i.e. how much editing the finished text needs. Lower is better for both. Multilingual word error rates, per language, are in the WER tooltip.
-
Speed is the real-time factor (RTFx): audio seconds per processing second, after the model is loaded; 100× means a minute of audio in 0.6 s. J / min is the energy the whole chip (CPU, GPU, Neural Engine and memory) used per minute of audio, idle power subtracted. Peak RAM is the peak footprint of the model worker, including loading. Speed differences use “N× faster” at a ratio of 2× or above and “N% faster” below; decreases use “N% slower”. Energy differences always use percentages (“N% less” or “N% more”). Noise-level WER/Format differences read same.
-
Which tiers are offered. Every measured tier is offered, with its figures. Where a tier loses anything against 16, its tooltip says what, starting with test clips it left empty or cut short, which an average word error rate hides; Vella's quality gate (English word error rate within 0.1 points of 16, up to 0.2 points for a model whose measured run-to-run noise is larger, the other languages within a similar limit, no dropped or cut-off segments) says whether a tier loses nothing measurable. The precision recommended for your Mac is gold: the smallest that passes the gate and runs on its GPU's matrix hardware. A tier that fails the gate is never recommended.
-
Measurements are from an M5 Max with a 40-core GPU; other M5 configurations have not yet been tested. Other Apple Silicon chips run the fallback paths qualified by self-test. Only M5 Max with 40 GPU cores matches the measured configuration. On every other Mac (including M5, M5 Pro and other M5 Max core counts), Speed and J / min show the M5 Max measurement with a warning triangle, and the footer names the measured Mac; they are not estimates for that Mac. WER, Format and Peak RAM stay as measured. Tooltip: “Measured on an M5 Max (40-core GPU). Your Mac will differ; vella diagnose measures it.”
Every figure is in Resources/benchmarks.json; the benchmark methods cover suites, scoring, timing, energy and build provenance. Benchmark your Mac or tune a model with the public benchmark kit.
brew install --cask tobynoskillson/tap/vellaHomebrew installs Vella in /Applications and links vella into Homebrew's bin. The cask follows each release; Vella then updates itself (Update Now). Remove it with brew uninstall --cask vella; --zap also deletes models, recordings and settings.
Without Homebrew:
curl -fsSL https://raw.githubusercontent.com/TobyNoSkillSon/Vella/main/scripts/install-public.sh | bashOr from a checkout: git clone https://github.com/TobyNoSkillSon/Vella && cd Vella && scripts/install.sh. Either way the installer downloads the prebuilt app for this version with curl, checks its SHA-256 and code signature, clears quarantine, installs it in ~/Applications, starts it and ends with ready: …. Coding agents can follow AGENTS.md.
Optional DMG. The release also carries a disk image, Vella-<version>.dmg, wrapped from the same release ZIP; the ZIP remains the primary asset. Open the image and drag Vella to Applications. For Terminal and agents, use /Applications/Vella.app/Contents/Helpers/vella, or use the command-line installer, which links vella. The app is self-signed and not notarized: after macOS blocks its first launch, use System Settings → Privacy & Security → Open Anyway, then confirm. The command-line installer above needs no Gatekeeper step.
Open Vella from the menu bar (after a Homebrew install, start it from Applications first), approve Microphone and Accessibility access, and press Control + Command + N. The first dictation without a model keeps the recording and offers Get model (size); after the download it transcribes the waiting recording.
Updating, verification and uninstalling
Updating. git pull && scripts/install.sh. Models, recordings and settings are kept. The installer refuses while Vella is recording, transcribing or loading a model ("try again in a moment"); otherwise it quits Vella, swaps the app in place and restarts it. The previous app is kept until the new one reports ready, and restored if the swap fails. By default, a certificate-signed installation is replaced only by the same signing identity, preserving macOS privacy permissions. Explicit --migrate-signing consent permits a change only to Vella’s pinned release signature; permissions must be re-granted and the old app stays available for rollback.
The installer refuses an older version or an older build of the same version. To intentionally downgrade, repeat the original command (including any custom destination) with --allow-downgrade. This does not bypass signing checks. Manual rollback restores the saved app directly, without running the installer.
From 0.8.x. The old Update available item only opens the GitHub release page. For a self-built installation (ad-hoc, Apple Development or another signing identity), update with scripts/install.sh --migrate-signing from a current checkout, or use the public installer with bash -s -- --migrate-signing. With terminal stdin, confirm the signing change with y/N, even if stderr is redirected. With piped or noninteractive stdin, --migrate-signing itself is explicit consent; the installer prints that authorization before proceeding. Settings, history, recordings and models are kept; macOS will ask for Microphone and Accessibility access again. The installer keeps the old app and prints its rollback path, including after a successful update. Manual ZIP/DMG replacement also keeps Application Support data, but browser downloads may require Privacy & Security → Open Anyway and the manual route does not create a rollback backup. See the 2.0.0 release notes for the full steps and model-selection migration.
A self-built 0.8.x or development-signed app may have an ad-hoc, Apple Development or other signature instead of Vella’s pinned release signature. The installer refuses that identity change by default. Opt in with the flag below. With terminal stdin the installer also explains the change and asks y/N, regardless of where stderr goes. With non-terminal stdin, the flag itself explicitly consents and the installer prints that authorization:
scripts/install.sh --migrate-signingFor the public installer: curl -fsSL https://raw.githubusercontent.com/TobyNoSkillSon/Vella/main/scripts/install-public.sh | bash -s -- --migrate-signing. This permits any verified installed Vella signing identity → Vella’s pinned release signature, never an arbitrary replacement identity. The installer names the identity being replaced. Same-identity updates need no migration consent. macOS will ask for Microphone and Accessibility again; re-enable Vella under System Settings → Privacy & Security. Settings, history, recordings and models are kept. The previous app stays at the printed path even after readiness; to roll back, quit Vella and move that app back to the printed destination. No upgrade proceeds while recording, transcribing or loading.
Verification. scripts/install-release.sh <version> --dry-run downloads and verifies a release without installing it. The SHA-256 detects a corrupted download; it comes from the same release, so it is not a signature. Download releases with the installer, not a browser: a browser adds the quarantine flag, and Gatekeeper then blocks the app.
Uninstalling. Turn off Launch at Login in Vella, then quit. Trash the installed app (~/Applications/Vella.app for the shell installer, /Applications/Vella.app for the DMG; Homebrew users run brew uninstall --cask vella instead). Remove ~/.local/bin/vella only if it points into that app, and ~/.local/share/vella/app-path if present. Models, recordings and settings remain in ~/Library/Application Support/Vella; delete them only if you want them gone. The detailed uninstall guide covers Vella’s preferences and caches.
Building from source
VELLA_BUILD=source scripts/install.sh # build this checkout and install it
scripts/build.sh # build dist/Vella.app only
scripts/release-check.sh # what CI and the release workflow check, run locallyA source build needs the Command Line Tools Swift (xcode-select --install), full Xcode and its Metal Toolchain (xcodebuild -downloadComponent MetalToolchain); the installer checks each and prints the command that fixes a missing one. Swift compiles with the Command Line Tools and the MLX shaders with Xcode's Metal compiler. The app is a Swift menu-bar process (Sources/Vella) that supervises the recognition helpers (Worker/), one process per loaded model; the app itself downloads the models. scripts/test-unit.sh builds and runs the app, core and update tests with the shipping Swift compiler and Xcode’s XCTest host. CONTRIBUTING.md has the rest.
scripts/worker-source-identity.sh permits content-only changes to the recorded Worker README files: its code pin excludes them, while their paths remain pinned. Separately, scripts/check-commit-citations.swift --check requires the full committed Worker tree, including READMEs, to match WORKER_FULL_TREE. After committing a Worker README-only change, refresh that declared identity and its published provenance references; the code pin stays unchanged.
| Mode | What happens |
|---|---|
| Dictation | Speak, click the field you want the text in, then finish. Vella transcribes and pastes there. If focus changed before insertion, the text goes to the clipboard instead. |
| Streaming | Text appears as it is recognized, wherever keyboard focus is. Pause speaking while you move between fields. |
The recording is kept. Audio is written to disk as you speak; if transcription fails, or no model is installed yet, the recording waits and can be transcribed or retried later. Vella inserts text and never presses Enter.
Shortcuts (below Microphone) sets the key chord, a single modifier key or a mouse button, and Toggle, Hold to Talk or Tap or Hold. Copy Last Transcript recovers the most recent text; Transcripts… opens a window of past transcripts, newest first, ten at a time with Show more for older ones, where a click on a transcript copies it; Open Vella Files shows saved recordings and transcripts.
Audio files go through the same models: vella transcribe talk.m4a (add --srt for subtitles). Your dictation always goes first.
Something wrong, or slow on your Mac? vella diagnose in Terminal reports your chip, versions, each loaded model's engine and fallbacks, and a timed run of five built-in clips compared with the reference Mac, and links to a prefilled GitHub issue. It includes nothing you dictated. See Reporting a problem.
The menu, the Models table, Keep Hot and Memory
Everything lives in the menu: the status line, then Models… · Keep Hot · Memory, then Start Dictation with Mode · Microphone · Shortcuts, your last transcript and saved recordings, then the agent skill, files and Launch at Login.
Choose. In Models…, choose a precision; every model runs optimized and falls back to plain MLX by itself. Fast and Exact select the recipe; unavailable cells explain why in their tooltip.
Preview. Choosing a cell previews its figures. Load, Reload or Get applies it; closing the menu discards the preview.
Load. Get asks before downloading. Unload frees memory without deleting weights; the trash button removes weights after confirmation.
Figures. Hover for the measurement source and differences from Standard. Other Macs show M5 Max measured speed with an M5 Max label, not their own speed.
Engine. Under a loaded model's name, Optimized Fast · or Optimized Exact · means Vella's kernels passed a self-test against the stock path on this Mac when the model loaded. Standard means the stock MLX path: the same model, slower. If the optimized path fails during a transcription, Vella redoes that transcription on the stock path and keeps the model there until it is reloaded.
Keep Hot sets how long an idle model stays loaded, timed per model from its last use:
| Loaded how | Idle window | Next launch | |
|---|---|---|---|
| Manually loaded | Load or Reload in the table | Always (default), 5, 15, 30 or 60 min | Loaded again |
| Loaded on demand | A dictation needed a model that was not loaded | 15 min (default), 5, 30, 60 min or Always | Not loaded |
Memory → Fit in free memory, the default, checks before each load that the model fits in memory macOS can hand out without swapping. If it does not, Vella unloads idle models to make room (on-demand ones first, least recently used first) or refuses the load and says how much it needs, how much is free and what to do. The check is best effort at load time, not a guarantee. Allow swap (slower) skips it.
The user guide covers every menu item, recovery and troubleshooting.
Install: follow AGENTS.md, then vella skill --install <skills directory> writes transcribe/SKILL.md. Copy Skill for Your Agent in the menu copies the same text.
vella status # Vella 2.0.0 running (pid 29335), parakeet-v3-ultra bf16 · Optimized Fast loaded · dictation model Parakeet v3 Ultra (bf16, Optimized Fast) · API http://127.0.0.1:63080/v1
vella transcribe talk.m4a # the transcript as plain text
vella transcribe talk.m4a --srt # SRT subtitles; also --vtt, --json, --verbose-json
vella models --json # all catalog rows, cells, reasons, source and download size
vella select parakeet-v3-ultra --precision bf16 --mode Fast
vella get parakeet-v3-ultra --yes # only after consent; downloads then loads
vella unload parakeet-v3-ultra # free memory, keep downloaded weights
vella url # http://127.0.0.1:63080/v1| API | |
|---|---|
| Compatible with | OpenAI audio transcriptions: POST /v1/audio/transcriptions, GET /v1/models |
| Base URL | vella url (127.0.0.1 only; the port changes when Vella restarts) |
| Key | Any; the SDKs require one |
model |
whisper-1 = the user's dictation model, or an id from /v1/models; transcription never downloads a model |
| Formats | text, json, verbose_json (timed segments), srt, vtt |
| Input | wav, mp3, m4a, flac, caf, aiff; up to 3 hours per file |
| Not supported | Translation, speaker labels, word-level timestamps |
from openai import OpenAI
import subprocess
client = OpenAI(base_url=subprocess.check_output(["vella", "url"], text=True).strip(), api_key="local") # the port changes at every launch
with open("talk.m4a", "rb") as f:
text = client.audio.transcriptions.create(model="whisper-1", file=f, response_format="text")Your audio and transcripts never leave your Mac. The recognition helpers run in a sandbox that denies all network access. The app's local API listens on 127.0.0.1 only and refuses browser requests. The only network traffic is model downloads from Hugging Face when you choose Get, and a check for a newer release at most once a day (at launch when due; failed checks retry about hourly) (an ordinary request to GitHub's releases API, no speech data); an update downloads only when you choose Update Now. There is no telemetry and no audio upload. Apps you dictate into, clipboard managers and Universal Clipboard see the text you insert or copy.
Verdict and Vella are free, open-source Mac apps that run AI models on your own Apple Silicon chip, for you and your coding agent: Verdict decides, Vella listens. Both are made by Toby NoSkillSon. Sponsor them on GitHub.
Vella 2.0 is MIT-licensed. Published 0.x releases remain Apache-2.0; this does not change their licence retroactively. Keep the copyright and permission notice in LICENSE, and the applicable third-party notices, when you redistribute. Vella ships no model weights; each model's licence is in its tooltip in the app and in Resources/models.json. The helpers include code adapted from mlx-audio-swift, mlx-audio and mlx-whisper (MIT) and link MLX and swift-transformers; THIRD_PARTY_NOTICES.md has each licence, and Vella.app carries it with LICENSE and NOTICE in Contents/Resources.
The Polish TEDx reference transcripts in the benchmark manifests are CC BY-NC-ND; see dataset terms and attribution.

