| Text Rewriting |
Global keyboard shortcut (Super+Shift+W by default) activates overlay from any app |
| Paste or type text, pick a tone — result on clipboard |
| Word-level diff view — green additions, red strikethrough removals |
| Three output modes: clipboard + diff, clipboard only, replace in place |
| Tone System |
| 7 built-in tones: Direct, Technical, Professional, Social, TL;DR, Flirty, Playful — 4 enabled by default (Direct, Technical, Professional, Social) |
| Create custom tones with a fully editable system prompt |
| Enable, disable, reorder, edit, or delete any tone |
| Reset to built-in defaults at any time |
| AI Providers |
| OpenAI (GPT-4o), Anthropic (Claude), Google Gemini, Ollama |
| Switch providers without restarting |
API keys auto-detected from environment and shell config (.env, .bashrc, .bash_profile, .profile, .zshrc, .zprofile, fish/config.fish, ~/.config/castword/.env) |
| Keys stored securely in GNOME Keyring — discovered keys migrated automatically on first run |
| Test connection button to verify provider setup |
| Speech-to-Text Phase 2 — infrastructure complete |
| Microphone recording via GStreamer with automatic silence detection |
| OpenAI Whisper (cloud) or whisper.cpp (fully offline) — binary auto-detected from PATH, model files scanned from standard directories |
| Transcribed text appended to input and copied to clipboard |
| Pause and resume recording without closing the window |
| System Integration |
| D-Bus service — no cold-start delay, process stays resident between activations |
Launch at Login toggle — installs XDG autostart entry, process starts with --background before the first keypress |
| Registered in GNOME app menu with icon, desktop file, AppStream metadata |
| First-run onboarding — guided shortcut registration (with conflict detection) and launch-at-login, all in one dialog |
| GTK4 + Libadwaita — native GNOME look and feel |
| Preferences |
| Four-page prefs window: Tones, Providers, Behaviour, Speech |
| All changes apply immediately — no save button required |
| Dismiss on Focus Loss — overlay closes automatically when you switch apps |
| Keep Text on Dismiss — choose whether input text is retained between activations |