Local offline voice dictation for Linux
Project description
voxy 🎙️
Hold. Speak. Release. Done.
Local, offline voice dictation for Linux — text appears instantly in whatever window is active. No cloud. No subscription. No audio ever leaves your machine.
Built on faster-whisper (2–4× faster than openai-whisper on CPU, same accuracy). Works on X11 and Wayland. Ships as a Nix flake.
Installation
uvx (try without installing)
uvx voxy-linux
pipx (persistent isolated install)
pipx install voxy-linux
AUR (Arch / Manjaro)
yay -S voxy-linux
NixOS
See the NixOS section below.
Prerequisites
Before installing via pip / pipx / uvx, install the required system packages.
Audio (required)
| Distro | Command |
|---|---|
| Debian / Ubuntu | sudo apt install libportaudio2 |
| Fedora | sudo dnf install portaudio |
| Arch | sudo pacman -S portaudio |
Text insertion (install the set that matches your display server)
| Display server | Packages |
|---|---|
| X11 | xclip + xdotool |
| Wayland | wl-clipboard + ydotool |
macOS / Windows: voxy is Linux-only. The package will install but will not run on other platforms.
How it works
- Hold the hotkey (default: Right Alt)
- Speak
- Release — transcribed text is pasted into the active window
That's it.
A small overlay appears in a configurable screen corner:
- REC (red) — microphone is active
- … (amber) — transcribing and processing
- Overlay disappears once text is inserted
Quick start
voxy # run in foreground
voxy --daemon install # install as a systemd user service
voxy --daemon remove # stop and remove the service
voxy --daemon status # check service status
On first run a default config is written to ~/.config/voxy/config.toml and the Whisper model is downloaded to ~/.cache/voxy/models/.
Configuration
~/.config/voxy/config.toml — created with defaults on first run, fully commented.
[hotkey]
key = "right_alt" # evdev/pynput key name
[model]
size = "small" # tiny | base | small | medium | large-v3
language = "auto" # auto-detect per utterance, or a BCP-47 code
fallback_language = "en"
[insertion]
method = "auto" # auto | x11 | wayland
[post_processing]
punctuation_commands = true # say "comma" → , "period" → . "new line" → ↵
auto_capitalize = true
strip_fillers = false
fillers = ["uh", "um", "hmm"]
[post_processing.substitutions]
"new line" = "\n"
"new paragraph" = "\n\n"
"comma" = ","
"period" = "."
[ui]
overlay = true
overlay_corner = "bottom-right" # top-left | top-right | bottom-left | bottom-right
audio_feedback = false
[logging]
level = "info"
Terminal paste: when a terminal emulator is the active window (alacritty, kitty, ghostty, gnome-terminal, konsole), voxy automatically uses Ctrl+Shift+V instead of Ctrl+V. No configuration needed.
Config path override: set VOXY_CONFIG=/path/to/config.toml to point voxy at a specific file. This takes priority over ~/.config/voxy/config.toml.
NixOS
Add to your flake
# flake.nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
voxy.url = "github:Slownite/voxy-linux";
};
outputs = { nixpkgs, voxy, ... }: {
nixosConfigurations.my-host = nixpkgs.lib.nixosSystem {
modules = [
voxy.nixosModules.voxy
./configuration.nix
];
};
};
}
Minimal config
# configuration.nix
{
services.voxy.enable = true;
# Required: the voxy user needs access to /dev/input for hotkey capture.
users.users.your-username.extraGroups = [ "input" ];
}
All options
| Option | Type | Default | Description |
|---|---|---|---|
services.voxy.enable |
bool |
false |
Enable voxy |
services.voxy.hotkey |
string |
"right_alt" |
Push-to-talk key (evdev/pynput name) |
services.voxy.modelSize |
enum |
"small" |
Whisper model size |
services.voxy.overlayCorner |
enum |
"bottom-right" |
Recording overlay corner |
modelSize — tiny · tiny.en · base · base.en · small · small.en · medium · medium.en · large-v1 · large-v2 · large-v3
overlayCorner — top-left · top-right · bottom-left · bottom-right
Example with custom options
services.voxy = {
enable = true;
hotkey = "right_ctrl";
modelSize = "base";
overlayCorner = "top-right";
};
Note: The NixOS module generates a
config.tomlfrom your declared options and passes it to the service viaVOXY_CONFIG.VOXY_CONFIGtakes priority over~/.config/voxy/config.toml— so the system-level declaration wins unless you run voxy manually without the env var set.
Development
nix develop # enter the dev shell (Python + all deps)
nix develop --command pytest # run the test suite
nix develop --command mypy --strict src/ # strict type check
Troubleshooting
Overlay not visible when running as a service
The service starts after graphical-session.target, but display auth (XAUTHORITY) may not be ready immediately. If journalctl --user -u voxy.service shows "overlay disabled", add a short delay:
# configuration.nix
systemd.user.services.voxy.serviceConfig.ExecStartPre = "/bin/sleep 2";
Indicator stays amber / nothing is pasted
Make sure you have rebuilt after any flake.nix change:
sudo nixos-rebuild switch
Or run from the dev shell directly — the installed package won't pick up source changes:
nix develop --command python -m voxy
Hotkey not captured
Your user must be in the input group:
users.users.your-username.extraGroups = [ "input" ];
Apply with sudo nixos-rebuild switch, then log out and back in.
Credits
UX reference: WisprFlow — voxy is the Linux-native, offline, open-source answer to it.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file voxy_linux-0.1.0.tar.gz.
File metadata
- Download URL: voxy_linux-0.1.0.tar.gz
- Upload date:
- Size: 31.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b1441b1760ed8483dcd6fd41c8d21ce150e738ea367f449b5518cc4a37afbef
|
|
| MD5 |
00cc3a3f434aec4a29ef2afbfa43ad7d
|
|
| BLAKE2b-256 |
2fb9720fad5140fc8d54a565b479b8806f1ca1bba0f5ed68d6d5c2da3e8f60ca
|
Provenance
The following attestation bundles were made for voxy_linux-0.1.0.tar.gz:
Publisher:
release.yml on Slownite/voxy-linux
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
voxy_linux-0.1.0.tar.gz -
Subject digest:
1b1441b1760ed8483dcd6fd41c8d21ce150e738ea367f449b5518cc4a37afbef - Sigstore transparency entry: 1429900585
- Sigstore integration time:
-
Permalink:
Slownite/voxy-linux@0721366a09521349652239a9db420f5176e0bff5 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Slownite
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0721366a09521349652239a9db420f5176e0bff5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file voxy_linux-0.1.0-py3-none-any.whl.
File metadata
- Download URL: voxy_linux-0.1.0-py3-none-any.whl
- Upload date:
- Size: 22.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2823b32e4ff093b97fe2e227f973fd5240bad5676f71e6b8700c985690a69bca
|
|
| MD5 |
bbee69820a0044d0537750dfe8e5060c
|
|
| BLAKE2b-256 |
c003354a7f8f9e863b73031d077632e4135ecf91e719ebc84c225dfb57f82b3f
|
Provenance
The following attestation bundles were made for voxy_linux-0.1.0-py3-none-any.whl:
Publisher:
release.yml on Slownite/voxy-linux
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
voxy_linux-0.1.0-py3-none-any.whl -
Subject digest:
2823b32e4ff093b97fe2e227f973fd5240bad5676f71e6b8700c985690a69bca - Sigstore transparency entry: 1429900589
- Sigstore integration time:
-
Permalink:
Slownite/voxy-linux@0721366a09521349652239a9db420f5176e0bff5 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Slownite
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0721366a09521349652239a9db420f5176e0bff5 -
Trigger Event:
push
-
Statement type: