Spiel is a local-first desktop dictation app. Press a hotkey, speak, press it again, and Spiel transcribes your speech locally and inserts the text where your cursor was.
It is built with Tauri, Rust, and Whisper through whisper-rs.
Most dictation tools either send audio to a cloud service, interrupt your workflow, or require a subscription. Spiel is designed to be quiet, fast, and private:
- Transcription runs on your machine.
- No account is required.
- No telemetry is built in.
- Normal dictation does not write raw audio files to disk.
- Model downloads happen only when you choose to install a model.
Installers are attached to GitHub releases:
https://github.com/robertdevore/spiel/releases
Choose the file for your computer:
- Intel Mac:
Spiel_1.0.0_macOS_x64.dmg - Apple Silicon Mac:
Spiel_1.0.0_macOS_arm64.dmg - Windows:
Spiel_1.0.0_x64-setup.exeorSpiel_1.0.0_x64_en-US.msi - Linux:
Spiel_1.0.0_amd64.AppImageorSpiel_1.0.0_amd64.deb
Current release builds are unsigned and not notarized. macOS may show a Gatekeeper warning such as:
Apple could not verify "Spiel.app" is free of malware.
For now, open it from System Settings -> Privacy & Security -> Open Anyway, or remove the quarantine flag after copying the app to Applications:
xattr -dr com.apple.quarantine /Applications/Spiel.app
open /Applications/Spiel.appSigned and notarized macOS builds require Apple Developer ID credentials in the release workflow.
- Install Spiel for your platform.
- Open the app.
- Install a speech model when prompted.
base.enis a good first choice for English. - Grant microphone permission.
- On macOS, grant Accessibility permission if you want Spiel to paste text into the active app automatically.
- Put your cursor in a text field.
- Press the global hotkey, speak, then press it again to stop.
The default hotkey is Cmd+Alt+D on macOS.
Spiel is a toggle:
- Start dictation from the hotkey, menu bar, or app window.
- Speak normally.
- Stop dictation with the same control.
- Spiel transcribes locally.
- Spiel inserts the text at the cursor when supported.
If automatic paste is unavailable, Spiel leaves the transcript on the clipboard so you can paste manually.
Spiel supports English-only and multilingual Whisper model families:
- English-only:
tiny.en,base.en,small.en - Multilingual:
tiny,base,small,medium
Smaller models are faster and use less memory. Larger models can be more accurate but need more disk space, RAM, and CPU time.
Spiel is designed for local-first dictation:
- Audio capture is processed locally.
- Transcription runs through local Whisper models.
- No transcript or audio telemetry is sent by the app.
- Network access is used for model downloads and optional checksum manifest checks.
- Model paths are validated to reject unsafe symlink or traversal targets.
macOS is the primary supported platform. It supports microphone capture, global hotkey dictation, and Accessibility-assisted paste.
Windows and Linux builds are available from the release workflow, but cursor insertion behavior may be clipboard-first depending on platform permissions and desktop environment support.
Requirements:
- Node.js 22+
- Rust stable
- Platform build tools required by Tauri
Install dependencies:
npm installRun in development:
npm run tauri devBuild the frontend:
npm run buildRun Rust tests:
cargo test --manifest-path src-tauri/Cargo.tomlBuild a native package for the current operating system:
npm run packagePlatform-specific package commands:
npm run package:mac
npm run package:windows
npm run package:linuxLocal macOS artifacts are written to release/artifacts/.
The Package apps GitHub Actions workflow builds and uploads:
Spiel-macOS-arm64: Apple Silicon.app.zipand.dmgSpiel-macOS-x64: Intel.app.zipand.dmgSpiel-Windows:.msiand NSIS.exeSpiel-Linux:.AppImageand.deb
Publishing a GitHub release runs the workflow and attaches those files to the release after each platform build finishes.
SPIEL_MODEL_DIR: custom local model storage directory.SPIEL_WHISPER_THREADS: override transcription thread count.SPIEL_WARMUP_ON_START: preload the current model on launch.SPIEL_PRE_PASTE_DELAY_MS: delay before paste.SPIEL_RESTORE_DELAY_MS: delay before restoring the clipboard.SPIEL_DOWNLOAD_RETRIES: retry count for transient model download failures.SPIEL_DOWNLOAD_RETRY_BACKOFF_MS: initial retry backoff.SPIEL_DOWNLOAD_CONNECT_TIMEOUT_MS: model download connection timeout.SPIEL_DOWNLOAD_TIMEOUT_MS: model download total timeout.SPIEL_MODEL_MANIFEST_URL: optional checksum manifest URL.
The current builds are not notarized. Use System Settings -> Privacy & Security -> Open Anyway, or remove the quarantine flag with xattr after copying the app to Applications.
Another app may already own the shortcut. Open Spiel settings and choose a different hotkey.
On macOS, automatic paste requires Accessibility permission. If Accessibility is not granted, Spiel should leave the transcript on the clipboard for manual paste.
Use a smaller model, reduce transcription threads, or enable model warm-up/keep-loaded behavior if you have enough memory.
Delete the model from Spiel and download it again. If you use sidecar checksums, make sure the .sha256 file matches the model exactly.
src/: Tauri frontend.src-tauri/src/: Rust backend for capture, transcription, insertion, model management, settings, and IPC commands.scripts/: packaging helpers..github/workflows/package.yml: release packaging workflow.
MIT. See LICENSE.