Talk to your Steam Deck instead of fighting the on-screen keyboard.
Hold a back grip button, say what you want to type, release → the text is on your clipboard, ready to paste into any field in Game Mode. Runs fully offline on-device via whisper.cpp. No cloud, no account, no network required.
Game Mode text entry is slow. Searching your library, typing a Steam friend message, filling in a launcher field, renaming a shortcut, entering a Wi-Fi password; all of it routes through the on-screen keyboard, which is fine for a three-letter search and miserable for anything longer.
Voxtype gives you a push-to-talk button that transcribes what you say into the clipboard. Paste it wherever. That's the whole thing.
- Push-to-talk via any controller button — defaults to R4 (right back grip), configurable in the plugin settings. Supports two-button chords.
- 100% offline — transcription runs locally with whisper.cpp. No audio ever leaves the device.
- Vulkan GPU acceleration — optional, ships a Vulkan-enabled voxtype binary for faster transcription with larger models. No system packages, no modifications to SteamOS.
- Model picker — defaults to
base.en(~140 MB, English). Swap to larger or multilingual models from the Settings panel. - Auto-start on boot — enable once, it's always ready.
The plugin is currently awaiting review for the official Decky Plugin Store. Once merged, it'll be installable with one tap from the Decky store in Game Mode.
- Grab the latest
decky-voxtype-*.zipfrom the Releases page. - In Game Mode, open Decky → gear icon → Developer → enable Developer Mode.
- A new Developer section appears. Tap Install Plugin from URL and paste the zip's release URL. Or copy the zip to
/home/deck/in Desktop Mode and unzip it into/home/deck/homebrew/plugins/. - Reload Steam (power menu → Switch to Gaming Mode restarts the UI if you're already there).
- Open the Voxtype panel from Decky's Quick Access menu.
- Hit Download model — pulls
base.en(~140 MB). One-time, takes under a minute on a decent connection. - Toggle Enable Voxtype.
- Press R4 (or whatever you set as PTT). A Listening toast appears.
- Talk. Press R4 again.
- A toast confirms the transcription. Text is on your clipboard. Paste it anywhere — focus the target text field and use the on-screen keyboard's paste action, or
Ctrl+Vif you have a keyboard attached.
| Setting | Default | Notes |
|---|---|---|
| Enable Voxtype | off | Starts/stops the daemon. |
| Auto-start on boot | on | Daemon starts automatically when the plugin loads. |
| Model | base.en |
English-optimized, 140 MB. Larger and multilingual models available in the dropdown. |
| PTT Button | R4 | Any controller button except STEAM / QAM. |
| PTT Chord | none | Optional second button. When set, recording fires only when both are pressed — useful if R4 is already bound in a game. |
| GPU acceleration (Vulkan) | off | Swaps the daemon to the Vulkan-enabled voxtype binary. Noticeably faster for larger models. |
The default base.en model is English-only. For other languages, pick a non-.en model from the Settings dropdown (base, small, medium, etc.). Larger models are more accurate but slower and use more VRAM — on the Deck's APU, small is usually the sweet spot for non-English use. Enable Vulkan acceleration if you go larger than base.
- Steam Deck (LCD and OLED) — tested and supported.
- Bazzite on handheld PCs — untested; likely works since Decky Loader and the whisper.cpp binaries don't depend on SteamOS-specific components, but the controller event path through
SteamClient.Inputhas only been verified on Deck hardware. Reports welcome. - Other SteamOS-like distros — unsupported.
"voxtype binary not found"
The remote_binary fetch didn't complete on first install. Reinstall the plugin, or grab a prebuilt zip from Releases and sideload it.
Daemon crashes or the toggle flips back to off
Check /home/deck/homebrew/logs/decky-voxtype/voxtype-daemon.log for the daemon's stdout/stderr. Plugin lifecycle events are in the numbered .log files in the same directory. Open an issue with the relevant lines.
PTT presses don't do anything Make sure the daemon is enabled (the toggle stays on). Also confirm the button isn't bound to a Steam Input chord in your current game's controller layout — Steam Input can swallow the raw press before the plugin sees it. Try a different PTT button, or set a two-button chord.
Transcription succeeded but clipboard is empty The legacy clipboard fallback was rejected by the CEF context. Reopen the Decky menu briefly so the plugin UI regains focus, then try again.
Transcription is gibberish
You're probably on base.en speaking a non-English language. Switch models in Settings.
- The plugin subscribes to Steam Deck controller button events via
SteamClient.Input. - When your configured button (or chord) is pressed, it tells the voxtype daemon to start/stop recording.
- Voxtype transcribes the audio locally with a Whisper model and writes the result to
/run/user/<uid>/voxtype/last_transcription.txt. - The plugin reads that file and copies the text to the system clipboard via the Web Clipboard API — the same mechanism other Decky plugins use.
No ydotool, no wtype, no system packages. The Vulkan voxtype binary is shipped alongside the CPU one so GPU acceleration works out of the box.
Requires Node 20+ and pnpm 9.
pnpm install
pnpm run build # rebuilds dist/index.js
# Package a ready-to-install zip (fetches voxtype binaries, assembles layout):
scripts/pack.sh ./dist-pkg
# Deploy to a Deck over SSH:
scp dist-pkg/decky-voxtype-*.zip deck@steamdeck:/home/deck/
ssh deck@steamdeck "cd /home/deck/homebrew/plugins && unzip -o /home/deck/decky-voxtype-*.zip"CI (.github/workflows/build.yml) produces the same zip on every push — grab it as an Actions artifact for testing. Tagged pushes (v*) also upload to a GitHub Release.
- whisper.cpp — the inference engine.
- voxtype — the daemon that wraps whisper.cpp.
- Decky Loader — the plugin framework.
BSD-3-Clause. Voxtype is distributed separately under its own license — see peteonrails/voxtype.
