rumilo
Rumilo is a CLI that dispatches specialized research subagents. It supports two modes:
webfor web research (search + fetch, stored in a sandboxed workspace)repofor git repository exploration (clone to workspace, git-aware tools)
Requirements
- Bun
- Git (for repo mode)
- Kagi session token
- Tabstack API key
Configuration
Rumilo reads configuration from $XDG_CONFIG_HOME/rumilo/config.toml.
Example:
[defaults]
model = "anthropic:claude-sonnet-4-20250514"
cleanup = true
[web]
model = "anthropic:claude-sonnet-4-20250514"
[repo]
model = "anthropic:claude-sonnet-4-20250514"
Custom Models
You can define custom OpenAI-compatible endpoints like Ollama, vLLM, or self-hosted models in the [custom_models] section:
[custom_models.ollama]
provider = "ollama"
api = "openai-completions"
base_url = "http://localhost:11434/v1"
api_key = "ollama"
id = "ollama/llama3"
name = "Llama 3 (Ollama)"
reasoning = false
input = ["text"]
cost = { input = 0, output = 0 }
context_window = 128000
max_tokens = 4096
Use custom models with the custom: prefix:
rumilo web "query" --model custom:ollama
rumilo repo -u <uri> "query" --model custom:ollama
Custom Model Fields
provider: Provider identifier (e.g., "ollama", "custom")api: API type - typically "openai-completions"base_url: API endpoint URLapi_key: API key (see value resolution below)id: Unique model identifiername: Human-readable display namereasoning: Whether the model supports thinking/reasoninginput: Input modalities -["text"]or["text", "image"]cost: Cost per million tokens (can use 0 for local models)context_window: Maximum context size in tokensmax_tokens: Maximum output tokensheaders: Optional custom HTTP headers (values support same resolution asapi_key)
Value Resolution
The api_key and headers fields support three formats, following pi-coding-agent conventions:
- Environment variable name: bare name is checked as env var, then used as literal
api_key = "MY_API_KEY" # resolves process.env.MY_API_KEY, or literal "MY_API_KEY" - Env var reference: explicit
$VARor${VAR}api_key = "$MY_API_KEY" # always resolves from env - Shell command:
!commandexecutes and uses stdoutapi_key = "!security find-generic-password -ws 'my-api'"
Compatibility Flags (Optional)
Some OpenAI-compatible endpoints have quirks. Use the compat section to override:
[custom_models.mistral]
provider = "mistral"
api = "openai-completions"
base_url = "https://api.mistral.ai/v1"
# ... other fields ...
[custom_models.mistral.compat]
max_tokens_field = "max_tokens"
requires_tool_result_name = true
requires_thinking_as_text = true
requires_mistral_tool_ids = true
See pi-ai documentation for all compat flags.
Credentials
Set credentials either via config or environment:
KAGI_SESSION_TOKEN: Kagi session tokenTABSTACK_API_KEY: Tabstack API key
Usage
rumilo web "how does X work"
rumilo web -u https://example.com/docs "explain the auth flow"
rumilo repo -u https://github.com/org/repo "how is caching implemented"