Configuration & files
Where Tau stores state, and the shape of its config files.
Tau keeps durable state in your home directory (~/.tau/) and reads
project-local resources from your working directory. This page is a reference for
those locations and file formats.
Tau home
~/.tau/
├── catalog.toml # optional provider/model catalog overlay
├── providers.json # provider/model preferences
├── credentials.json # saved API keys / OAuth tokens (0600, atomic writes)
├── settings.json # general settings (trust default, shell prefix)
├── trust.json # versioned project-input trust decisions
├── tui.json # TUI theme, keybindings, and layout
├── sessions/ # saved sessions, per project
├── skills/ # user-level skills
├── prompts/ # user-level prompt templates
├── themes/ # user-level TUI themes
├── SYSTEM.md # optional replacement system-prompt base
├── APPEND_SYSTEM.md # optional appended system-prompt instructions
├── AGENTS.md # global project instructions
└── logs/ # diagnostics
Tau also reads user-level .agents resources: ~/.agents/skills/,
~/.agents/prompts/, ~/.agents/AGENTS.md.
settings.json may contain "defaultProjectTrust": "ask" | "always" | "never". It is user-global only; a project cannot choose its own trust
policy. The default is ask. Interactive ask opens the trust modal; headless
ask safely declines. trust.json is managed atomically by Tau; do not add
relative paths or unknown fields. See Project trust.
Startup update checks cache their latest PyPI result in
~/.tau/cache/update-check.json and refresh at most once per day. Set
TAU_NO_UPDATE_CHECK=1 to disable the check; Tau also skips it when CI is set.
System prompt files
Tau can replace or extend its generated system prompt with Tau-native Markdown files:
~/.tau/SYSTEM.md # user replacement
~/.tau/APPEND_SYSTEM.md # user append
<project>/.tau/SYSTEM.md # project replacement
<project>/.tau/APPEND_SYSTEM.md # project append
For each kind, precedence is explicit CLI input, then the project file, then the user file. A higher-precedence append file replaces the lower-precedence append file; Tau does not concatenate project and user files. Replacement content still receives the selected append text, project instructions, eligible skills, the current date, and the working directory. Empty files are valid explicit values.
Run /reload after adding, changing, or removing a file. Tau rebuilds the prompt
for the next model request without adding it to session history. /session
resource diagnostics identify selected, shadowed, or CLI-overridden files. A
selected file that cannot be inspected or decoded as UTF-8 stops startup or
reload rather than silently falling back.
System prompt files are Tau-specific and are not discovered from .agents.
Project files load only after the destination cwd is trusted. User files and
explicit CLI values remain available when project inputs are declined. Trust is
an input-loading guard, not a sandbox; inspect trusted prompt files because they
can replace or extend the model’s highest-priority instructions.
Network proxies
Tau uses httpx for provider requests, OAuth token refreshes, and startup update
checks, so it honors standard proxy environment variables such as HTTP_PROXY,
HTTPS_PROXY, ALL_PROXY, and NO_PROXY.
SOCKS proxies are supported by the base installation. Use explicit schemes when you can:
export ALL_PROXY=socks5://127.0.0.1:1080
# or, when proxy-side DNS resolution is required:
export ALL_PROXY=socks5h://127.0.0.1:1080
Tau also accepts the generic socks:// form that some systems and tools set in
the environment. Before creating its own HTTP clients, Tau normalizes
socks://... to socks5://... because httpx does not recognize the generic
scheme directly.
This matters for users behind corporate proxies, VPNs, local tunnels, or
privacy/network-routing setups: without SOCKS support and normalization, Tau can
fail before making a model API request with an error like
Unknown scheme for proxy URL URL('socks://...').
Providers
Tau separates provider metadata from runtime preferences:
src/tau_coding/data/catalog.tomlships the built-in provider/model catalog.~/.tau/catalog.tomloptionally adds personal providers or overlays built-ins.~/.tau/providers.jsonstores runtime preferences such as the default provider, default model, scoped models, headers, and timeout/retry settings.
Tau intentionally reads catalog overlays only from the user-level
~/.tau/catalog.toml. There is no project-level .tau/catalog.toml, so cloning a
repository cannot silently redirect a provider’s base_url or credentials to an
unexpected service.
Provider catalog overlays
Add reusable custom provider definitions to ~/.tau/catalog.toml:
schema_version = 1
[[providers]]
name = "local-gateway"
display_name = "Local Gateway"
kind = "openai-compatible"
base_url = "http://localhost:11434/v1"
api_key_env = "LOCAL_GATEWAY_API_KEY"
credential_name = "local-gateway"
models = ["qwen-coder"]
default_model = "qwen-coder"
docs_url = "https://example.test/local-gateway"
[providers.context_windows]
qwen-coder = 64000
Catalog entries support kind values of openai-compatible, anthropic, and
openai-codex. For most custom services, start with openai-compatible.
User catalog overlays can be partial when they use the same name as a built-in
provider. Scalar fields replace built-in values, models are merged with user
models first, and context_windows are merged. Provider-level compat is merged
key by key. Model metadata is merged by model;
its headers, compat, and thinking_level_map mappings are merged, while other
metadata fields—including the complete cost_tiers array—replace the built-in
value. A model’s compat wins over the provider’s, so a built-in per-model value
overrides a provider-level overlay — override at the model level to change it.
removed_models is an additive provider-scoped tombstone list. Tau applies it
last and removes matching model-list, metadata, context-window, thinking, and
default references after merging. Bundled tombstones therefore prevent stale
user overlays from restoring models that Tau previously advertised for the wrong
provider. They do not affect the same model ID on another provider.
OpenAI prompt-cache compat keys
Tau enables OpenAI cache affinity automatically only for api.openai.com and the
dedicated Codex OAuth provider. OpenAI-compatible gateways can opt in per provider
or model:
| Key | Effect |
|---|---|
supportsPromptCacheKey | Sends the stable session-derived prompt_cache_key body field |
sendSessionAffinityHeaders | Sends headers using sessionAffinityFormat |
sessionAffinityFormat | openai sends session_id; openrouter sends x-session-id |
Unknown gateways retain their existing request shape by default. Enable only fields
documented by the target service. Codex uses its dedicated session-id header
mapping and does not read these OpenAI-compatible settings.
Anthropic prompt-cache compat keys
Providers using the anthropic-messages API accept three compat booleans
controlling prompt caching. All default to enabled, except that cache_control is
detected as unsupported for any base URL that is not api.anthropic.com, since
several providers speak the Anthropic protocol through a gateway.
| Key | Effect when false |
|---|---|
supportsCacheControl | No cache breakpoints at all; the request is byte-identical to an uncached one |
supportsLongCacheRetention | Clamps the 1 hour TTL to the 5 minute default |
supportsCacheControlOnTools | Drops only the tool-schema breakpoint |
Set them per provider or per model. For example, to stop requesting the one-hour cache on a Claude subscription:
schema_version = 1
[[providers]]
name = "anthropic"
compat = { supportsLongCacheRetention = false }
The thinking fields (thinking_levels, thinking_models,
thinking_default, thinking_parameter) replace as a group when
thinking_levels is present.
catalog.toml does not store runtime request options such as custom HTTP
headers, timeouts, or retry settings. Put those in ~/.tau/providers.json on the
matching provider entry.
Invalid catalog files fail loudly. Tau rejects unknown keys, empty required
strings, empty model names, unsupported provider kinds, default models that are
not listed in models, thinking_models or context_windows entries for
unknown models, and non-positive or non-integer context-window values.
Model metadata can retain a backward-compatible flat cost and optionally
provide ordered cost_tiers for rates that depend on input size:
[providers.model_metadata."long-context-model"]
cost = { input = 0.3, output = 1.2, cacheRead = 0.06, cacheWrite = 0 }
cost_tiers = [
{ max_input_tokens = 512000, input = 0.3, output = 1.2, cacheRead = 0.06, cacheWrite = 0 },
{ input = 0.6, output = 2.4, cacheRead = 0.12, cacheWrite = 0 },
]
Limits are inclusive, must increase strictly, and the final tier must omit
max_input_tokens so every valid input size has a rate. Callers that understand
tiers should select the first tier whose limit includes the input-token count;
older callers continue to see cost as the base rate.
All rates are per million tokens. cacheWrite is the 5-minute cache-write
rate; entries may add an optional cacheWrite1h rate for Anthropic’s 1-hour
TTL cache writes, which Anthropic bills higher. When cacheWrite1h is absent,
1-hour writes fall back to the cacheWrite rate.
Provider preferences
Provider preferences live in ~/.tau/providers.json:
{
"schema_version": 2,
"default_provider": "local-gateway",
"provider_preferences": {
"local-gateway": {
"default_model": "qwen-coder",
"headers": { "X-Provider-Header": "value" },
"thinking_defaults": { "qwen-coder": "low" },
"timeout_seconds": 120,
"max_retries": 2,
"max_retry_delay_seconds": 0.5
}
},
"scoped_models": [
{ "provider": "local-gateway", "model": "qwen-coder" }
]
}
provider_preferenceskeys must refer to providers from the effective catalog (src/tau_coding/data/catalog.tomlplus~/.tau/catalog.toml).headersis optional (string→string). For example, Hugging Face organization billing can be configured with"headers": { "X-HF-Bill-To": "my-org" }on thehuggingfaceprovider preference.thinking_defaultsremembers the preferred thinking level per model for new sessions; resumed sessions still use their session history. The built-inhuggingfacepreference also accepts"inference_providers": { "zai-org/GLM-5.2": "deepinfra" }. Each key must be a configured model and each value an explicit provider suffix advertised by Hugging Face—not thefastest,cheapest, orpreferredrouting policies. Tau snapshots the selected suffix into new session metadata, retains it on resume, and sends only the suffixed wire model; ordinary model identity and catalog metadata remain unsuffixed. Without a preference, Tau starts with automatic routing and pins thex-inference-providerreported by the first successful response./sessionreports the route; changing the active session route is available in Tau 0.3.10+ through the externaltau-huggingfaceextension; clone it and launch Tau withtau -e ./tau-huggingface.timeout_secondsdefaults to60(> 0);max_retriesdefaults to2;max_retry_delay_secondsdefaults to1(both ≥ 0). Retries cover transient HTTP statuses (408,409,425,429,5xx), transport errors, and transient in-stream SSE errors that arrive on an otherwise successful HTTP 200 response. Anthropic retriesapi_error,overloaded_error, andrate_limit_error; OpenAI Codex retries transient events such asserver_is_overloaded. In-stream errors remain terminal after partial content to prevent duplicate output or tool calls.- API keys and OAuth credentials are not stored here — they live in
~/.tau/credentials.json(private but not encrypted). OAuth objects may contain provider metadata such as a GitHub Enterprise domain and are refreshed automatically. Resolution order: stored credential, then the env var named byapi_key_env. - The selected model must be present in that provider’s
modelslist. Add custom or local model names tomodelsbefore using them as defaults, CLI/TUI selections, or scoped models. scoped_modelsare favorites for the Ctrl+P quick-cycle.providers.jsonusesschema_version: 2and stores preferences only. Provider capabilities—model lists, context windows, transports, metadata, and thinking support—always come from the current effective catalog.- Older
providers.jsonfiles that contain fullprovidersentries are migrated automatically on first load. Tau keeps the original asproviders.json.bak, moves custom provider definitions to~/.tau/catalog.toml, and rewrites built-in providers from the current catalog while preserving safe preferences. This prevents old model or thinking metadata from hiding capabilities added by a Tau upgrade. - Tau ignores unrecognized preference fields for cross-version compatibility,
but rejects an unsupported
schema_versionrather than risking a destructive rewrite with the wrong format. - Custom models declare thinking support in
catalog.tomlwiththinking_levels,thinking_default,thinking_models, andthinking_parameter("reasoning_effort","reasoning.effort", or"anthropic.thinking").
Writes after /login, /model, or scoped-model changes reload the file first,
apply only the requested change, write atomically, and keep a .bak backup.
See the Providers & models guide for usage.
Shell settings
Tau runs shell commands in a non-interactive shell — both terminal-input
commands (! gst, !! ll) and the agent’s bash tool. Non-interactive shells
don’t load your aliases from ~/.zshrc or ~/.bashrc, and Tau deliberately
never reads those files (they can hold tokens and side effects).
To make your own aliases available, opt in with a shellCommandPrefix in
~/.tau/settings.json that loads a small Tau-specific alias file:
# ~/.tau/shell-aliases.bash
alias gst='git status'
alias ga='git add'
alias gc='git commit'
{
"shellCommandPrefix": "shopt -s expand_aliases\nsource ~/.tau/shell-aliases.bash"
}
Then start a new session and try ! gst. Notes:
- Commands run through bash-style non-interactive execution, so keep aliases POSIX/bash-compatible (zsh-only syntax, functions, or interactive startup logic may not work).
- Changing
settings.jsonaffects new sessions; an already-running session keeps the prefix it started with. - The snake_case key
shell_command_prefixis also accepted. - Unrecognized fields are ignored for compatibility with newer Tau versions; recognized fields remain strictly validated.
TUI settings
The built-in frontend reads optional settings from ~/.tau/tui.json:
{
"theme": "high-contrast",
"sidebar_position": "right",
"turn_notification": "desktop",
"keybindings": {
"cancel": "escape",
"command_palette": "ctrl+k",
"session_picker": "ctrl+r",
"queue_follow_up": "alt+enter",
"accept_completion": "tab",
"completion_next": "down",
"completion_previous": "up",
"thinking_cycle": "shift+tab",
"model_cycle": "ctrl+p",
"toggle_thinking": "ctrl+t",
"toggle_tool_results": "ctrl+o",
"copy_message": "ctrl+c",
"quit": "ctrl+d"
}
}
Built-in themes: tau-dark (default), tau-light, high-contrast. Custom
themes are JSON files in ~/.tau/themes/ or a project’s .tau/themes/ — see
Themes. Set one with /theme.
Textual’s native theme picker is mapped to the same Tau themes and persists
the same theme setting. A configured theme that cannot be found falls back
to tau-dark with a startup notice, without overwriting the setting. Keys use
Textual syntax; omitted keys keep their defaults. Tau ignores unrecognized
settings and keybinding names so a tui.json written by a newer Tau version does
not prevent an older version from starting. Recognized settings remain strict:
Tau rejects invalid values, empty keys, and duplicate assignments.
sidebar_position:"right"(default),"left", or"off". Controls placement of the session metadata sidebar."off"hides the sidebar entirely; the compact session info row below the prompt still works.turn_notification:"desktop"(default),"bell", or"off". When Tau’s terminal surface is unfocused and the agent becomes fully idle,"desktop"selects OSC 9 for Ghostty, iTerm2, and MinTTY, or Kitty’s OSC 99 protocol for Kitty. Unknown terminals receive no sequence rather than an incompatible one."bell"explicitly emits the standard terminal bell so the terminal can mark the tab or request attention instead; depending on terminal settings, BEL may play a sound. Desktop notifications can also use the operating system’s configured notification sound. No notification is emitted while Tau has focus.
Full list in Keyboard shortcuts.
Sessions
~/.tau/sessions/<cleaned-path>-<short-hash>/
Each working directory gets its own subdirectory; transcripts are append-only JSONL preserving messages, model changes, and the active leaf of the session tree. Metadata is indexed per project. See the Sessions guide.
Skills, prompts & project context
Resource discovery order (later overrides earlier) is documented in
Skills & prompt templates and
Project instructions. In short: user-level
~/.tau and ~/.agents, then project-level .tau and .agents, with
AGENTS.md discovered from the project root down to your current directory.
Context
/session reports a rough context estimate and breakdown. Auto-compaction
triggers near the model’s context window minus a reserve; override per run with
--auto-compact-threshold. Details in Managing context.