Skip to main content

Configuration

xops has two configuration surfaces: its own ~/.xops/config.yaml (channels, memory), and goose's provider config (which LLM powers the engine).

xops config

file: ~/.xops/config.yaml

channels:
telegram:
enabled: true
accounts:
default:
token: "<bot-token-from-@BotFather>"
allowFrom:
- your_telegram_username

memory:
path: ~/.xops/memory.db
  • allowFrom — usernames permitted to talk to your bot. Empty list = anyone. Always set this.
  • There is no AI provider section here. The LLM is goose's concern.

Engine (goose) configuration

xops spawns goose run for every action and chat turn. Which model answers is decided by goose:

goose configure

Provider selection per xops run can override goose's default via environment variables:

XOPS_PROVIDER=ollama XOPS_MODEL=qwen25-32k bun scripts/poc-run.ts docker xops-victim
VariableMeaningDefault
XOPS_PROVIDERgoose provider for engine runs (ollama, anthropic, ...)goose's configured default
XOPS_MODELmodel name passed to goosegoose's configured default

recommendation: use a native goose provider (ollama, anthropic). The claude-acp bridge provider has known issues driving xops runs — hangs on parallel tool calls and no skill passthrough.

Scoped credentials (Kubernetes)

Action runs against Kubernetes use a namespace-scoped kubeconfig generated by:

bash scripts/provision-poc-rbac.sh <namespace> [context]

The engine sets KUBECONFIG to this file for the run. Tokens expire after 2 hours — re-run the script to refresh.

Skill grants

Each skill declares the commands it may use in its frontmatter:

metadata:
xops:
grants: [ps, inspect, logs, stats, events, restart, update]

The guard denies anything outside the grants, and denies CRITICAL-tier commands (rm, delete, prune, ...) even if granted.