# Blurt Tray-based push-to-talk voice-to-text for Linux and Windows. Toggle recording with a hotkey, speak, toggle off — Blurt transcribes the clip and copies the text to your clipboard. If a transcript starts with `to my agent`, the rest is dispatched as an agent task instead of copied. ## Setup Requires [uv](https://docs.astral.sh/uv/) and Python 3.11+. ```sh uv sync ``` ### API key Blurt reads the key for its current model's provider in this order: environment variable → OS keyring → local file. | Provider | Env var | Keyring (`service` / `user`) | File | |------------|----------------------|---------------------------------|----------------------| | OpenAI | `OPENAI_API_KEY` | `openai-api-key` / `felixm` | `api_key.txt` | | OpenRouter | `OPENROUTER_API_KEY` | `openrouter-api-key` / `felixm` | `openrouter_key.txt` | Key files and runtime config stay local (gitignored). ## Running **Linux** — `uv run blurt` starts the tray icon. Bind a hotkey to `./blurt-toggle`, which signals the running instance to start/stop recording. **Windows** — launch `blurt.vbs` (runs Blurt with no console window). The global hotkey is **F20**. ## Configuration Set from the tray menu, or via files / env vars: - **Model** — `model.txt` / `BLURT_TRANSCRIPTION_MODEL`. For lowest latency use `openai/whisper-large-v3-turbo` (OpenRouter, served by Groq). - **Language** — `language.txt` / `BLURT_TRANSCRIPTION_LANGUAGE` (`en`, `de`). - **Input device** — tray menu. Logs are written to `blurt.log` in your temp directory (openable from the tray menu). ## Moving to another machine `uv run export.py` writes a zip of just the source (no 200 MB+ `.venv`, no caches, no key files) to your temp directory. It's pure Python, so it runs the same on Linux and Windows — no shell needed — and it only reads, so it's safe while Blurt is recording. Unzip on the other machine and `uv sync` to rebuild `.venv` for that OS. (Or simply `git clone` the repo fresh.)