yardsort

Settings & harnesses

Use Settings to configure Yardsort, choose the commands that launch your coding agents and add custom harnesses. A harness is an agent's command and argument templates; it uses the agent you have installed and authenticated on your computer.

Open with the Settings button at the bottom of the left panel, or Ctrl+Shift+, / ⌘,.

Most settings are stored in a plain TOML file you can read, back up and edit:

SystemLocation
Linux~/.config/dev.yardsort.app/settings.toml
macOS~/Library/Application Support/dev.yardsort.app/settings.toml
Windows%APPDATA%\dev.yardsort.app\settings.toml

If the file cannot be parsed, Yardsort says so, runs on defaults, and keeps your file as settings.toml.unreadable instead of overwriting it.

Harnesses

A harness is a coding agent that runs in a terminal. To Yardsort a harness is pure configuration — a command and some argument templates — so any agent can be added without waiting for a new release.

Harness settings

Built in: Claude Code, Codex, Grok, OpenCode, OMP, Cursor, Pi. The dot next to each shows whether its command was found on your PATH, and the mark beside it is the one that identifies that agent everywhere else in the app — the tab strip, the composer's picker, the session history. A harness you add yourself is drawn as its initial.

OMP and Pi offer a thinking level through the effort picker and accept provider/model model names. Cursor runs cursor-agent, not the cursor editor command; if your installation only exposes agent, change its Command to agent. Install links on the welcome screen lead to each CLI's own setup instructions. Install and sign in before launching a workspace.

Pi's built-in definition requires a version with --session-id and --fork (verified with 0.87.1). OMP and Cursor resume only the latest conversation in a workspace and do not offer Fork. Pi supports resuming and forking individual conversations.

Opening messages for OMP and Pi are prefixed with a space so an initial @ is treated as text, not a file attachment. Keep that space in their Prompt args templates. Cursor's Write args are empty: drafting uses another available writer or your API-key fallback.

If you already had a custom harness with id omp, cursor or pi, it stays custom and keeps its command, argument templates and session identity. It takes precedence over the built-in with that id. Deleting the custom entry reveals the built-in; keep the custom entry if you still need it to resume older conversations.

Fields

FieldMeaning
LabelThe name shown in the app.
CommandThe program to run. It is looked up on the PATH of your login shell (so tools installed by mise, nvm, Homebrew or cargo are found), and the resolved location is shown underneath.
Always argsPassed on every launch — the place for flags you always want, such as a permission mode.
Auto argsWhat starts the agent in its auto permission mode, e.g. --permission-mode auto. Passed only while Always start in auto mode is ticked — see below.
Model argsUsed when a model is chosen, e.g. --model {model}.
Effort argsUsed when an effort level is chosen, e.g. --effort {effort}.
Session id argsUsed when Yardsort assigns the conversation's id, e.g. --session-id {session_id}.
Context argsBackground context for a new conversation — the agent's system-prompt option — with {context} for the text, e.g. --append-system-prompt {context}. Yardsort puts the note about the workspace's other conversations there. Set for Claude Code, Codex (-c developer_instructions={context}), Grok (--rules {context}), OMP (--append-system-prompt={context}) and pi, the five checked to work; empty means the note goes after the first message instead.
Prompt argsHow the first message is passed, e.g. -- {prompt} or --prompt {prompt}. Keep the -- when the prompt is a bare argument: it tells the agent's own parser that the options have ended, so a message starting with - is read as text rather than as a flag.
Resume argsReplaces the last two groups to continue a conversation, e.g. --resume {session_id}.
Fork argsSame, to fork one, e.g. --resume {session_id} --fork-session --session-id {new_session_id}.
Resume context argsThe same for a resumed or forked conversation, after the resume or fork args, so it is told about the conversations there are now. For OMP and pi they are the context args, since both build their system prompt at each launch. For Claude Code they are --system-prompt-snapshot off --append-system-prompt {context}: Claude Code otherwise sends the system prompt a conversation began with, and with the snapshot off it builds it afresh for that launch. Empty for Codex and Grok, which keep that prompt whatever they are passed. A Claude Code too old to know --system-prompt-snapshot refuses to start with it; clear this field, or update Claude Code.
Write argsThe agent's non-interactive mode, used to have it write a commit message or a pull request — e.g. --print {prompt}, exec {prompt}, run {prompt}. Its whole command line, with {prompt} for the question. Empty means this agent will not be asked. See Commits & pull requests.
Models / EffortsSuggestions for the composer's pickers. Models accept free text regardless. Leave efforts empty to hide that picker.
Prompt transportargv passes the prompt as an argument — simple and reliable. stdin starts the agent first and pastes the prompt once it has been quiet for the given time — for agents with no prompt argument. Very long prompts switch to stdin automatically.
Session idassigned: Yardsort chooses the id, so any session can be resumed. latest in folder: the agent chooses, and only its most recent conversation in a workspace can be continued.
Good atOptional, in your words: what this harness suits. Used only by Assist, to suggest a harness for the message you are typing. Yardsort never fills this in for you.
EnabledDisabled harnesses stay configured but are not offered.

Auto mode

Tick Always start in auto mode on a harness and every session of it — new, resumed or forked — starts in the agent's own auto mode, so it asks you less often. It is off until you turn it on, for each harness separately. Each built-in knows its flag:

HarnessAuto argsWhat the agent still asks about
Claude Code, Grok--permission-mode autoWhatever its own auto mode judges risky.
Codex--approve-for-meApprovals go to Codex's automatic review, in its sandbox.
OpenCode--autoOnly what your OpenCode config explicitly denies — the broadest.
OMP--approval-mode=writeRunning commands and other exec tools; reads and edits go ahead.
Cursor--auto-reviewWhatever Cursor's reviewer does not consider safe.
Pi—Pi asks nothing, so the switch is unavailable.

What auto mode allows is the agent's decision, not Yardsort's — read its documentation before turning it on. For a custom harness, type its flag into Auto args and the switch becomes available. Drafting a commit message or a pull request never uses auto mode: it runs no tools.

How arguments work

  • Arguments are split like a shell would split them (quotes group words), but no shell is involved. Each argument reaches the program exactly as written, and a placeholder's value is never split again — a prompt full of quotes, spaces and newlines is still one argument.
  • Placeholders: {prompt} {model} {effort} {session_id} {new_session_id}.
  • A group whose placeholder has no value is dropped whole: choose no model and no dangling --model is passed.

What will run at the bottom shows the exact command lines — start, resume and fork — for sample values, updating as you type. Test launch starts the harness, unsaved changes included, in a scratch terminal so you can see it come up.

Restoring defaults

For a built-in harness only your changes are saved, so improved defaults in a newer Yardsort still reach every field you left alone. Restore defaults discards your changes.

Adding your own harness

Add custom harness, give it an id, and fill in at least the command. If the agent can take a first message, set Prompt args (or the stdin transport); fill Resume args / Fork args if it can continue conversations, and Write args if it has a print or exec mode and you would like it writing your commit messages. Custom harnesses appear in the composer and the tab bar like the built-in ones. Delete removes one.

Assist

Optional AI help from TypeSafe's Jev model: badges on changed files, and suggestions in the composer. It is off until you enter your own API key and tick a feature, and each feature says exactly what it sends. A third switch, under the review, tells Assist who wrote each changed file in the Changes list's own words; it is off by default because it changes what is sent. The key is kept in your system credential store, never in this file.

See Assist for the whole feature, including what happens when it is unavailable.

Workspaces

SettingMeaning
Worktree folderNew workspaces are created in <folder>/<project>/<workspace>. Default: ~/yardsort. Must be an absolute path; keep it short on Windows, where deep paths hit the 260-character limit.
Branch prefixNew branches are named <prefix>/<workspace>. Default ys. Empty means no prefix.

Both apply to workspaces created from now on; existing ones stay where they are.

General

SettingMeaning
Editor commandWhat Edit ↗ runs — code, cursor, zed, … It is given the workspace folder and then the file. Empty tries cursor, code, zed, windsurf, subl and idea in turn.
Check for updates automaticallyLooks for a newer release shortly after starting, once a day, and when you return to the window if that is overdue. On by default. Check now looks immediately and shows the version you are running. See Updates.
Command lineWhere your terminal finds the ys command, and whether it is this version. Install ys (or Update) appears when it is missing or old, except where your package already installed it. See Installing ys.
Notify me when an agent finishesDesktop notifications when a busy agent goes quiet while you are in another window. On by default.
Record when agents start and exitKeep a local record of each process Yardsort starts in a workspace and how it ended — see Activity. On by default; nothing an agent prints is read, and nothing leaves the machine. Off, and nothing new is written.
Show the activity timelineExperimental: an Activity button in each workspace's footer opens the list of what was recorded there. Off by default.
Capture what Cursor reportsOff by default. The Cursor agent started from Yardsort is given a small plugin, on its command line for that launch alone, whose hooks report each tool with its file or duration, each file it changes and — where Cursor fires it — each turn with its tokens; see What Cursor reports. Your own Cursor hooks are not edited and keep running. Needs the recording switch.
Capture what OMP reports, Capture what pi reportsOff by default. OMP or pi started from Yardsort is given a small extension, on its command line for that launch alone, that reports each turn with its tokens, each tool with its file or duration, and (OMP) each permission you answer — see What OMP and pi report. Your own extensions keep running. Needs the recording switch.
Read what Grok recordsOff by default. For Grok started from Yardsort, reads the metadata-only event log and usage file Grok keeps in its own session directory — tools with durations, permissions you answered, turns and tokens — see What Grok records. Nothing is given to Grok and nothing in ~/.grok is written. Needs the recording switch.
Capture what OpenCode reportsOff by default. OpenCode started from Yardsort is given a small plugin through its environment, for that launch alone, that reports each prompt, tool, file edit, permission prompt and turn with its token usage — see What OpenCode reports. Your opencode.json is not edited and your own plugins keep running. Needs the recording switch.
Capture what Codex reportsOff by default. Codex started from Yardsort is given a notify program for that launch, and each turn's commands, file changes and token usage are read from Codex's own session file — see What Codex reports. Nothing in ~/.codex is edited, and a notify of your own still runs. Needs the recording switch.
Capture what Claude Code reportsOff by default. Claude Code started from Yardsort is given hooks that report each prompt, tool, turn and session end as metadata — see What Claude Code reports. Your own Claude Code settings are never edited; the hooks ride on a per-launch settings file. Needs the recording switch above.
Clear all recorded activityForgets every recorded event and run at once. Beneath it: how much is recorded, where the exit spool, the agents' inbox and the Claude Code hooks file are, and counters for anything that went wrong while recording.

Usage

The Usage panel has its own Show Usage in the sidebar switch in its header. Hiding the button leaves Usage available from the command palette. This preference is saved under [usage] as show_in_sidebar in settings.toml. Token usage reads the agents' own logs independently of the recording and capture switches above. See Usage.

Workflow writer

Under Assist → Writing commit messages, pull requests and workflows, choose the Workflow writer used by Write it on a new workflow. Automatic finds an installed, enabled harness with Write args; you can instead select a specific available harness. The choice is saved as workflow_harness_id under [draft] in settings.toml and does not change the agent used for workspace commit or pull request drafts. See Workflows and Assist for availability and API fallback behaviour.

Environment variables

For testing and unusual setups:

VariableEffect
YARDSORT_DATA_DIRKeep the database and settings.toml in this folder — a throwaway profile. Each one gets its own background process, so its agents are separate too.
YARDSORT_WORKTREE_ROOTOverride the worktree folder.
YARDSORT_YS_DIRWhere Install ys puts ys, instead of ~/.local/bin, /usr/local/bin or %LOCALAPPDATA%\dev.yardsort.app\bin. A development build refreshes a copy there at startup too, which it otherwise never does.
YARDSORT_NO_DAEMONRun terminals inside Yardsort, as it did before v0.4: they stop when it closes.

Programs started in a workspace are themselves given YARDSORT_RUN_ID, YARDSORT_WORKSPACE_ID and, for an agent, YARDSORT_SESSION_RECORD_ID — ids a script or hook can use to say which run it belongs to. See Activity.

Keyboard

Settings → Keyboard, Shortcuts in the bottom bar, or Mod+/ opens a searchable cheat sheet and editable bindings. Record a combination, clear a binding or restore defaults, then press Save shortcuts. Conflicts are shown before saving. See Keyboard shortcuts for defaults and navigation instructions. These preferences live in the profile's SQLite UI state rather than settings.toml.

The optional first-launch tour can be replayed from Help / Tour in the bottom bar or from the command palette (Mod+K). See First launch.