commandOK is a Spotlight-like command generator for your terminal. Pops up when you need it and gets out of the way when you don't.
Built with Ratatui and powered by your choice of LLM provider.
WARN: you must always verify the generated command before accepting it
cargo install commandokOn first run, a default config is created at ~/.commandok/config.toml. Add your API key for at least one provider:
[commandok]
provider = "anthropic" # Options: anthropic, openai, google, mistral, ollama, openrouter, xai
system_prompt = "You are a terminal command generator. Given a natural language description, output ONLY the shell command appropriate for the user's OS and shell. No explanation, no markdown, no code blocks, no backticks. Just the raw command."
[anthropic]
api_key = "sk-ant-..."
model = "claude-opus-4-6"
[openai]
api_key = "sk-..."
model = "gpt-5.4"
[google]
api_key = "..."
model = "gemini-3-flash-preview"
[mistral]
api_key = "..."
model = "mistral-small-latest"
# api_url = "https://api.mistral.ai/v1" # default
[ollama]
model = "gemma3:1b"
# api_url = "http://localhost:11434" # default, change if running elsewhere
[openrouter]
api_key = ""
model = "qwen/qwen3.6-plus:free"
# api_url = "https://openrouter.ai/api/v1" # default
[xai]
api_key = ""
model = "grok-4.20-0309-reasoning"
# api_url = "https://api.x.ai/v1" # defaultRun commandok in any terminal. A search bar appears inline below your cursor.
- Type a natural language description of the command you need
- Press Enter -- the command streams in token-by-token
- Press Enter again to accept (injects the command into your shell) or Esc to cancel
| Key | Action |
|---|---|
| Enter | Submit prompt / Accept generated command |
| Esc | Cancel and dismiss |
| Shift+Tab | Cycle through configured providers |
| Up / Down | Browse prompt history |
| Ctrl+U | Clear input line |
| Ctrl+C | Quit |
| Left / Right / Home / End | Move cursor |
- Create
src/provider/yourprovider.rswith apub async fn stream(...)function - Add
pub mod yourprovider;tosrc/provider/mod.rs - Add a variant to the
Providerenum and wire it infrom_name()/stream() - Add the section to
Configinsrc/config.rsandPROVIDER_ORDER
MIT
