Profiles and models

How +local picks a profile: a plain task uses the default profile, claude, with Opus 5.5 in the cloud; a task with +local uses the profile local, with gpt-oss:20b on your own computer. At the top, Irie’s task box holds two tasks: @shop fix the cart total, and @shop +local add comments to cart.go. An arrow leads from the first to the profile claude, the default: Claude Code with claude-opus-5-5, at max effort in auto mode, which runs in the cloud on Anthropic’s servers. An arrow leads from the second to the profile local: Claude Code with gpt-oss:20b, pointed at Ollama, which runs on your own computer. › @shop fix the cart total › @shop +local add comments to cart.go claude (the default) local Claude Code Claude Code claude-opus-5-5 gpt-oss:20b max effort, auto mode pointed at Ollama Anthropic’s servers your computer in the cloud with Ollama
A profile is a recipe you name for starting an agent. +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.

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>

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"

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]

SettingDefaultWhat it does
sidebar_width34The 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_donefalseShow done rows in red, like rows that need you.
max_sub_rows6How 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]

SettingDefaultWhat 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_donefalseClose 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_tmuxtrueHide 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.

SettingDefaultWhat 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]

SettingDefaultWhat 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]

SettingDefaultWhat 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.
submodulestrueCheck out the repo’s submodules in each worktree.

[tmux]

SettingDefaultWhat 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]

SettingDefaultWhat it does
keep_days30How 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]

SettingDefaultWhat 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.

SettingDefaultWhat it does
watchtrueLook in a task’s own worktree when its turn ends, and say on its card what is left.
nudges2How 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.