Profiles and models
+local picks one for a task; without a +, a task uses the default.Irie’s settings live in one file. It says which agents and AI models Irie can start, where your projects are, and how Irie behaves.
The settings file
$ irie config path
/home/alice/.config/irie/config.toml
The file is written in TOML: [sections] and key = value lines. Irie doesn’t make it; until you do, every setting has its default.
Every setting is optional. A setting Irie doesn’t know stops it with an error that names the setting, and so does a value that makes no sense, such as a default profile that doesn’t exist.
$ irie config print
This prints the settings in effect: the defaults, with your file on top. Use it to check a change.
If you set XDG_CONFIG_HOME, the file is $XDG_CONFIG_HOME/irie/config.toml instead.
When a change takes effect
Irie reads the file when its core starts, and a running core keeps the settings it started with.
ui.sidebar_widthandui.focus_keytake effect at the nextirieoririe up, which restarts the core for them.- For any other setting, restart the core yourself. Your agents keep running.
tmux -L irie respawn-pane -k -t irie-agents:core
Run irie config print first: a core can’t start with a file that has an error in it, and the list then shows core offline until you fix it.
The list reads ui.red_on_done when it starts. After changing that one, restart the list as well:
tmux -L irie respawn-pane -k -t irie:0.0
Profiles
A profile names the program to start, the model to ask for and its settings. A task uses spawn.default_profile, unless its first line names another with +.
The built-in profile, claude, is Claude Code with Opus 5.5 at max effort in auto mode:
[profiles.claude]
harness = "claude-code"
command = "claude"
model = "claude-opus-5-5"
effort = "max"
permission_mode = "auto"
args = []
env = {}
To change it, set only the keys you want. This keeps the rest of claude and lowers its effort:
[profiles.claude]
effort = "high"
A new profile starts empty instead: Claude Code, with no model, effort or permission mode, so Claude Code’s own defaults apply. Give it the ones you want:
[profiles.fast]
model = "claude-sonnet-5-5"
effort = "low"
Then +fast fix the typo in the README uses it. spawn.default_profile = "fast" would make it the default.
What a Claude Code profile runs
claude <args> --model <model> --effort <effort> --permission-mode <mode> \
--settings <file> --session-id <id> --name <name> <task>
- A setting left empty leaves its flag out.
--settingsadds Irie’s hooks for this agent only: small commands Claude Code runs to tell Irie how it’s doing. Your own settings files aren’t touched, and your own hooks still run.--nameis passed only whenclaude --helplists it.- If Claude Code turns down a value, such as a model your account can’t use, the agent fails with Claude Code’s own message. Irie never swaps in another value.
Profiles for local models
Claude Code can use a model on your own computer through a server that speaks Anthropic’s API, such as Ollama, LM Studio or llama-server. A profile points it there with environment settings. This one uses Ollama’s settings for Claude Code:
[profiles.local]
model = "gpt-oss:20b"
env = { ANTHROPIC_BASE_URL = "http://127.0.0.1:11434", ANTHROPIC_AUTH_TOKEN = "ollama", ANTHROPIC_API_KEY = "" }
Fetch the model first, with ollama pull gpt-oss:20b. Then start small jobs with +local, such as @shop +local add comments to cart.go.
Give it room. A model holds only so much text at a time, its context, counted in tokens: pieces of words. With under 24 GiB of video memory, Ollama gives a model 4,096 tokens and quietly cuts anything longer, so an agent can lose its instructions without a word.
Ollama asks for at least 64,000 tokens for coding tools. Start it with OLLAMA_CONTEXT_LENGTH=64000 ollama serve, or set it in the Ollama app’s settings: see Ollama on context length.
How well it works is up to the model: Anthropic doesn’t support Claude Code on other companies’ models.
Irie checking a local model’s context before an agent starts, and saying how to fix it, is planned. Its local setting for profiles isn’t accepted yet. Planned
Any other agent
A profile with harness = "generic" starts any program that runs in a terminal. Irie then sees only whether the program is still running: its row shows working until it ends.
[profiles.aider]
harness = "generic"
command = "aider"
args = ["--model", "ollama_chat/gpt-oss:20b"]
task = "paste"
commandis required, and the program’s own flags go inargs.model,effortandpermission_modearen’t allowed here.task = "arg", the default, adds the task as the program’s last argument.task = "paste"types the task into the program once it’s running, then presses Enter. It suits programs that take their task at a prompt.
Fuller support for more agents, starting with Codex CLI, is planned after version 1. Planned
Other agents covers them in full, including a launcher or an agent your own team built.
Every setting
These are all the settings Irie knows, with their defaults. Durations are written like "30s", "5m" or "24h", and folders as absolute or ~/ paths.
[ui]
| Setting | Default | What it does |
|---|---|---|
sidebar_width | 34 | The list’s width, in columns. At least 10. |
focus_key | "C-]" | The key that moves between the list and the agent, as tmux names keys: C-] is Ctrl+]. |
red_on_done | false | Show done rows in red, like rows that need you. |
max_sub_rows | 6 | How many of an agent’s helpers to list under it. Planned |
ghostty | "auto" | auto or off: whether Irie opens a Ghostty window of its own. Planned |
[spawn]
| Setting | Default | What it does |
|---|---|---|
default_profile | "claude" | The profile a task uses when it names none. |
default_cwd | "" | Where a task runs when it names no repo or folder. Empty means a new, empty folder for each task. |
ready_timeout | "30s" | How long an agent has to get going before its row shows stalled. |
close_when_done | false | Close a session once its turn ends and it stays quiet for close_delay. A new prompt, or anything it needs from you, cancels the close. A session whose answer is for you to read, such as a status request or a reply that ends in a question, never closes by itself, and nor does one that waits on work of its own in the background or whose work isn’t through yet ([dog]). Reopen brings it back. |
close_delay | "30s" | How long a finished session waits before it closes. |
hide_tmux | true | Hide Irie’s tmux from agents, so their own tmux commands can’t reach it. |
teammates | "off" | "panes" lets Claude Code sessions start agent teams. Each teammate is a Claude Code session of its own in a terminal, which the Mac app’s terminal view shows beside its session, in a column on the right. Teammates cost tokens as any session does. Sessions started after a change follow it. |
[profiles.<name>]
The defaults of a new profile. The built-in claude profile has its own values, shown above.
| Setting | Default | What it does |
|---|---|---|
harness | "claude-code" | claude-code or generic: how Irie starts and follows the program. |
command | "" | The program. Empty runs claude for claude-code; generic needs one. |
model | "" | The model to ask for, with --model. Claude Code only. |
effort | "" | How hard the model thinks, with --effort. Claude Code only. |
permission_mode | "" | What the agent may do without asking, with --permission-mode. Claude Code only. |
args | [] | More arguments, right after the program. |
env | {} | Environment settings added for the agent. |
task | "" | arg or paste: how a generic program gets its task. Empty means arg. |
[repos]
| Setting | Default | What it does |
|---|---|---|
roots | [] | Folders to find repos in, two levels deep, such as ["~/code"]. |
aliases | {} | Names for repos, such as { web = "~/code/website" }. A name is letters, digits, dots, dashes and underscores. |
[worktree]
| Setting | Default | What it does |
|---|---|---|
root | "" | Where worktrees go. Empty means ~/.local/share/irie/worktrees. |
base | "HEAD" | The commit a new branch starts from. HEAD is the one your checkout is on; "main" would always start from main. |
branch_prefix | "irie/" | Put in front of every branch name. |
copy | [".claude/settings.local.json", "CLAUDE.local.md"] | Local files to copy into each worktree when your repo has them, as well as the ones .worktreeinclude names. Paths inside the repo. |
submodules | true | Check out the repo’s submodules in each worktree. |
[tmux]
| Setting | Default | What it does |
|---|---|---|
path | "" | The tmux program, as an absolute path. Empty means tmux on your PATH, then in /opt/homebrew/bin, /usr/local/bin and /usr/bin. |
socket | "irie" | The name of Irie’s own tmux, as in tmux -L irie. Change it only while Irie isn’t running. |
[journal]
| Setting | Default | What it does |
|---|---|---|
keep_days | 30 | How many days of records Irie keeps. At least 1. |
tool_input | "summary" | summary or none: whether the records keep a line about each step, such as the command an agent ran. |
[hold]
| Setting | Default | What it does |
|---|---|---|
max | "24h" | The longest Irie will hold a paused agent. Pausing is planned, but this already sets how long Irie’s hooks may take. Planned |
[dog]
The jot dog sees each task you start through to the end. When a task’s turn ends with work left in its own worktree, files not committed or commits not yet in its repo’s land branch, it sends the agent back once to finish, and the task’s card says what is left until the work lands. A task you close is done: the dog never sends it back or lists it, whatever it left. It only reads: it never commits, merges or deletes anything.
| Setting | Default | What it does |
|---|---|---|
watch | true | Look in a task’s own worktree when its turn ends, and say on its card what is left. |
nudges | 2 | How many times the dog sends one task back to finish, between two of your messages. 0 only watches. It never sends one back while the agent waits on work of its own in the background, or when it asks you something. |
land | {} | By repo, the branch its work must reach to be through, such as { shop = "main" }. Name a repo by its alias, its folder’s name or its path. A repo without one is through once its work is committed. |
Settings for later milestones aren’t accepted yet, and Irie would stop with an unknown-setting error. [notes] comes with milestones 5 and 7, [freeze] with milestone 6, [subagents] with milestone 8 and [env] with milestone 9.