Settings
Every persistent setting, changeable mid-session.
Type /settings to open a dialog with every persistent setting. Changes are written to $ZOT_HOME/config.json without requiring a restart. Rendering toggles apply immediately; settings that affect model requests apply to subsequent turns. Rows that open a sub-view (like model shortcuts) use esc to go back one level before it closes the dialog.
Configuration files
zot stores both configuration and runtime state under $ZOT_HOME, even when that directory is under the platform's state directory. You can edit these files directly while zot is not running:
config.jsonselects the defaultproviderandmodeland stores UI preferences. Interactive settings and model selections also update it. Explicit--providerand--modelflags override the saved selection for a run.models.jsonoptionally defines model metadata and provider endpoints (baseUrl). Registering a model does not select it as the default.auth.jsonstores credentials. Prefer/loginfor supported providers, and keep secrets out of the other two files.
Neither config.json nor models.json is required when starting zot with an explicit provider and model. Without a saved or explicit provider, zot defaults to Anthropic and may offer login if no usable credentials are available. Local Ollama does not need login.
For example, create this minimal configuration, or merge these fields into your existing file, to select a local Ollama model by default:
{
"provider": "ollama",
"model": "qwen3.5:4b"
}The Ollama server must already be running and have that model installed. See Models for local, remote, and two-host setup examples. baseUrl belongs in models.json, not config.json.
Codemode configuration
The optional Codemode tool is configured through CLI flags or the codemode object in $ZOT_HOME/config.json, not an interactive settings toggle. Merge this object into your configuration to enable script-only client tool presentation:
{
"codemode": {
"enabled": true,
"mode": "only",
"inlineBudget": 3000
}
}mode accepts on (keep direct tool definitions) and only (expose client tools through scripts). inlineBudget is a non-negative estimated token budget for tool declarations, defaulting to 3000. Zero keeps discovery without inline declarations. --codemode and --codemode-only override the saved mode for a run. --no-tools takes precedence.
Chat timestamps
Open /settings, choose **timestamps**, then configure:
Timestamps use muted text on existing separator rows, aligned with the tool box's right edge and leaving the same two-column right margin. They use the local timezone. **Start of each day** shows YYYY-MM-DD HH:MM on the first timestamp and when the day changes, then just HH:MM for subsequent timestamps that day. **Every timestamp** always includes the date.
An interval of 0 shows every eligible message. A positive interval selects a timestamp once at least that many minutes have elapsed since the last selected timestamp, not since the previous message. The first eligible message and day changes always qualify. Date display does not change interval selection.
For example, enable timestamps on every eligible message with the date always visible by merging these fields into your configuration:
{
"chat_timestamps": true,
"chat_timestamp_interval_minutes": 0,
"chat_timestamp_date": "every_message"
}You can set any nonnegative integer interval directly in config.json. Missing or negative intervals use 0, and explicitly saved intervals are preserved. Missing or unknown date modes use day_start. Changes through /settings apply immediately and persist across restarts. Press esc to return from the timestamps sub-view to settings.
User messages, completed assistant messages, and tool results are eligible. Missing timestamps and compaction summaries are skipped, and labels that do not fit in a narrow terminal are omitted. Saved session timestamps are reused on resume. These controls affect only the interactive display, not model input or print, JSON, or RPC output.