Environment variables
Slo works with no configuration at all. These variables are for when you want to change where things live, run long workflows, connect other tools, or run Slo somewhere without a person watching.
Most people only ever set two or three. Start with the profiles at the bottom if you'd rather copy something that works.
The ones most people set
| Variable | Default | What it does |
|---|---|---|
SLO_KB_DIR | not set | Folder of markdown notes Slo consults before designing or debugging, and writes discoveries back to. See Give Slo a memory. |
SLO_MODEL_POOL | not set | Two or more models to fall back through when one is rate limited or out of credit. See the model pool. |
SLO_SUBAGENT_MAX_CONCURRENCY | 4 | How many sub-agents a dynamic workflow runs at once. |
Paths
| Variable | Default | What it does |
|---|---|---|
SLO_HOME | ~/.slo | Where Slo keeps everything: sessions, credentials, preferences, schedules, your skills and workflows. |
SLO_SKILLS_DIR | set by the installer | The built-in skill library. The installer points this at the installed package, so you rarely need to touch it. |
SLO_USER_SKILLS_DIR | $SLO_HOME/user_skills | Your own skills. |
SLO_USER_WORKFLOWS_DIR | $SLO_HOME/user_workflows | Your own workflows. |
SLO_AUTH_FILE | $SLO_HOME/global/authentication.json | Where sign-in credentials are stored. |
SLO_PREFERENCES_FILE | $SLO_HOME/global/preferences.json | Saved model, reasoning level and model pool. |
SLO_SCHEDULES_DIR | $SLO_HOME/schedules | Schedule definitions and run records. |
SLO_CONNECTORS_DIR | $SLO_HOME/connectors | Saved connector credentials. |
Two things stay under your real home directory whatever SLO_HOME says: the global instruction file (~/.slo/SLO.md) and installed plugins (~/.slo/plugins/).
Models and providers
| Variable | Default | What it does |
|---|---|---|
OPENAI_API_KEY or SLO_OPENAI_API_KEY | not set | OpenAI API key. Used instead of your saved sign-in. |
ANTHROPIC_API_KEY or SLO_ANTHROPIC_API_KEY | not set | Anthropic API key. |
KIMI_FOR_CODING_API_KEY or SLO_KIMI_FOR_CODING_API_KEY | not set | Kimi For Coding API key. |
SLO_OPENROUTER_API_KEY | not set | OpenRouter API key. See OpenRouter. |
SLO_DEFAULT_MODEL_NAME | gpt-5.4 | The model to use when you haven't picked one with /model or --model. |
SLO_MODEL_POOL | not set | Fallback pool: "gpt-5.4,claude-sonnet-4-6" or a JSON list. |
SLO_MODEL_CATALOG_OVERRIDES_FILE | $SLO_HOME/global/model_catalog_overrides.json | Tweaks to built-in model settings. |
If both the plain and SLO_ versions of a key are set, the plain one (OPENAI_API_KEY) wins. An environment key always beats a saved sign-in.
Sign-in timeouts
| Variable | Default | What it does |
|---|---|---|
SLO_OAUTH_TIMEOUT_SECONDS | 60 | How long the browser sign-in waits for the callback. |
SLO_OAUTH_MANUAL_TIMEOUT_SECONDS | 900 | Time allowed to finish a browser sign-in by pasting the response by hand. |
SLO_OAUTH_DEVICE_TIMEOUT_SECONDS | 900 | Time allowed to finish an OpenAI device-code sign-in. |
SLO_OAUTH_CALLBACK_HOST | 127.0.0.1 | Address the sign-in callback listens on. |
Flaky connections
| Variable | Default | What it does |
|---|---|---|
SLO_PROVIDER_STREAM_FIRST_PROGRESS_TIMEOUT_SECONDS | 300 | How long to wait for a model to start responding before reconnecting once. |
SLO_PROVIDER_STREAM_IDLE_TIMEOUT_SECONDS | 300 | Longest pause allowed in the middle of a response. |
SLO_PROVIDER_STREAM_CONTINUATION_MAX_ATTEMPTS | 5 | How many times to pick up an interrupted response. |
Long-running workflows
These matter when you use dynamic workflows. The defaults are generous on purpose.
| Variable | Default | What it does |
|---|---|---|
SLO_SUBAGENT_MAX_CONCURRENCY | 4 | Sub-agents running at the same time. |
SLO_SUBAGENT_MAX_TASKS | 8 | Most sub-agents the orchestrator can start in one go. |
SLO_STREAM_INACTIVITY_TIMEOUT_SECONDS | 10800 (3h) | How long the main agent can go without output before it's treated as hung. |
SLO_SUBAGENT_INACTIVITY_TIMEOUT_SECONDS | 7200 (2h) | How long a sub-agent can go without output before it's stopped. Any output resets the clock, so this isn't a limit on total run time. |
SLO_SUBAGENT_TERMINATE_GRACE_SECONDS | 5 | Time a sub-agent gets to exit cleanly before it's force-stopped. |
SLO_BASH_DEFAULT_TIMEOUT_SECONDS | 1800 (30m) | Longest a single shell command can run. 0 removes the limit. |
SLO_DETACHED_WORKFLOWS | on | Set to 0 to stop Slo launching workflows in the background. |
SLO_MAX_DETACHED_WORKFLOWS | 2 | Background workflows allowed per session at once. |
SLO_AUTO_VISUALIZE | on | Opens slo visualize in a new terminal window when sub-agents start. 0 turns it off. |
SLO_VISUALIZER_TERMINAL_APP | your default terminal | Which terminal to open it in, for example iTerm on macOS or kitty on Linux. |
Headless runs
| Variable | Default | What it does |
|---|---|---|
SLO_SESSION_ID | a new id per run | Share one session across several slo run calls. Letters, numbers, ., _ and -. |
SLO_HEADLESS_HEARTBEAT_SECONDS | 15 | How often a headless run reports it's alive on stderr. |
SLO_HEADLESS_COOPERATIVE_ABORT_GRACE_SECONDS | 5 | How long an aborted run gets to wrap up cleanly. |
Connectors
| Variable | Default | What it does |
|---|---|---|
SLO_ATLASSIAN_SITE_URL | not set | Your Jira and Confluence site, like https://your-team.atlassian.net. |
SLO_ATLASSIAN_EMAIL | not set | The Atlassian account email. |
SLO_ATLASSIAN_API_TOKEN | not set | An Atlassian API token. All three are needed. |
SLO_ATLASSIAN_TIMEOUT_SECONDS | 30 | Request timeout. Whole seconds only. |
SLO_CONNECTOR_PREFER_ENV | off | Set to 1 to prefer these variables over saved connector credentials. Useful in CI. |
See Connectors.
Plugins
| Variable | Default | What it does |
|---|---|---|
SLO_PLUGINS_DISABLED | not set | Set to exactly 1 to turn every plugin off, including in sub-agents. |
SLO_PLUGIN_INTERCEPTION_TIMEOUT_SECONDS | 5 | How long a plugin gets to approve or change a tool call. |
Installing and updating
These are read by the install script:
| Variable | Default | What it does |
|---|---|---|
SLO_VERSION | the current release | Install a specific release tag, for example v0.18.0. dev installs the latest development build. |
SLO_PYTHON_VERSION | 3.11.7 | The Python version Slo is installed with. |
curl -fsSL https://get-slo.sh/install.sh | SLO_VERSION='v0.18.0' bash
The installer writes SLO_HOME and SLO_SKILLS_DIR to ~/.slo/shell/environment.sh and sources it from your shell profile. Cron jobs and services don't load your shell profile, so set anything important there explicitly.
Set by Slo, not by you
You may see SLO_WORKFLOW_ID, SLO_PARENT_PID and SLO_CAPTURE_DIR in a sub-agent's environment. Slo sets these to keep track of its own processes. Leave them alone.
Ready-made profiles
Your laptop. A knowledge base and a fallback model:
export SLO_KB_DIR="$HOME/notes/kb"
export SLO_MODEL_POOL="gpt-5.4,claude-sonnet-4-6"
Long dynamic workflows. More parallelism, generous timeouts:
export SLO_SUBAGENT_MAX_CONCURRENCY=6
export SLO_STREAM_INACTIVITY_TIMEOUT_SECONDS=10800
export SLO_SUBAGENT_INACTIVITY_TIMEOUT_SECONDS=7200
export SLO_BASH_DEFAULT_TIMEOUT_SECONDS=1800
A CI runner. Keys from secrets, no pop-up windows, no plugins:
export OPENAI_API_KEY="$CI_OPENAI_API_KEY"
export SLO_AUTO_VISUALIZE=0
export SLO_PLUGINS_DISABLED=1
export SLO_CONNECTOR_PREFER_ENV=1
export SLO_SESSION_ID="ci-$CI_PIPELINE_ID"