Skip to content

Settings and config.json

cornercase is configured from the Settings modal, opened with the Settings button at the bottom of the projects column. Every change is saved at once to config.json, so there is nothing to apply or restart. You can also edit the file by hand, and the server applies it within a second; this page lists every key. A script or another app reads and changes the same settings with cornercase config.

The modal has eight tabs: Worktrees, Agents, Accounts, Flows, Issues, UI, Remote and Plugins. Click a row, or select it and press Enter, to change it; the line at the bottom explains what the selected row does and confirms every change.

The restart button next to done restarts cornercase. It first lists what is running in your terminals, since restarting stops every program in them; your projects, workspaces, tabs and splits come back, each tab with a new shell in its folder. See Restart the server.

SettingsWorktreesAgentsAccountsFlowsIssuesUIRemotePluginsworktrees folder~/.cornercase/worktreesnew worktrees go in <folder>/<repo>/<branch>fetch branches every 5 mincommits to pull show as↓npull requests [x] showneach workspace's pull request and its checks, from ghmerged PRs in stats [x] shownyour merged pull requests, from gh and glab
Row What it sets
worktrees folder Where new worktrees are checked out: <folder>/<repository>/<branch>. Must be an absolute path or start with ~/.
fetch branches every How often, in minutes, the remotes are fetched to show the commits to pull as ↓n on each workspace. 0 turns it off.
merged PRs in stats On (the default): Usage → Stats counts your merged pull requests and merge requests, read with gh and glab. Off: nothing is asked. The note names the accounts read, or why none were. See Usage and stats.
pull requests On (the default): each workspace whose branch has a pull request on GitHub shows its number, the state of its checks and whether it has merge conflicts, read with gh. Off: nothing is asked. The note says why none show when gh is missing, logged out or failing. See Pull requests and their checks.
SettingsWorktreesAgentsAccountsFlowsIssuesUIRemotePluginsAgentdefault agentautothe agent in your tab, otherwise asksend the prompt [ ] typed, you press Entertrust prompts [ ] left to yousaying yes runs the repo's agent configresume conversations [x] after a restartClaude, Codex, Gemini, Grok, Cursor, Copilot, in theikeep awake [ ] neverno idle sleep while an agent worksHow each agent startsclaude defaultcodex defaultgemini defaultopencode defaultgrok defaultcursor defaultcopilot default+ another agent…
Row What it sets
default agent The agent that takes an issue when you don’t pick one: a specific agent, or auto, which uses the agent running in your current tab and otherwise asks.
send the prompt Off: the prompt is typed on one line and you press Enter. On: it is pasted as written and sent for you.
trust prompts Off (the default): when an agent cornercase starts asks “do you trust this folder?”, you answer, and the prompt waits. On: cornercase answers yes for you, which lets the repository’s agent configuration run.
resume conversations On (the default): after a server restart, kill-server or a reboot, each pane that ran Claude Code, Codex, Gemini CLI, Grok Build, Cursor CLI or GitHub Copilot CLI comes back in the same conversation. Off: it comes back as a plain shell. See Agents resume their conversations.
keep awake Off (the default): the computer sleeps when idle, as it always does. On: while an agent is working, the computer does not go to sleep on its own. The note says whether it is being kept awake now, or why it can’t be on this machine. See Keep the computer awake.
How each agent starts One row per agent: the default agent, the agents with start modes (claude, codex, gemini, opencode, grok, cursor and copilot out of the box) and any you set up. Click one to choose its mode and extra arguments.
+ another agent… Adds one of the other known agents to the list so you can set it up.

Choosing how an agent starts opens a list of its modes, each with the arguments it adds, plus extra arguments… for anything else you want on its command line:

SettingsWorktreesAgentsAccountsFlowsIssuesUIRemotePlugins›How should claude start?defaultno mode argumentsaccept edits--permission-mode acceptEditsauto--permission-mode autoplan--permission-mode planskip permissions (dangerous)--dangerously-skip-permissionsextra arguments…

Modes whose name says dangerous are shown in red. Extra arguments are split like a shell would: use quotes for arguments with spaces.

SettingsWorktreesAgentsAccountsFlowsIssuesUIRemotePluginsClaude Codeworksigned in as ana@acme.dev (max)claude's own login·~/.clauderename…a name for the window; its folder stayspersonal signed in as ana@example.com (pro)~/.config/cornercase/server.accounts/crename…a name for the window; its folder stays+ add accountmakes its folder and opens a tab to log inCodexSystemcodex's own login·~/.codexrename…a name for the window; its folder stays+ add accountmakes its folder and opens a tab to log inGemini CLISystemgemini's own login·~rename…a name for the window; its folder stays+ add accountmakes its folder and opens a tab to log in

Your agent accounts. One section per agent that takes accounts (Claude Code, Codex, Gemini CLI): first the agent’s own login (System, or the name you gave it, with its usual folder), then a row per account (whether it is logged in and as whom, its folder, and the settings that stopped being shared), each followed by rename…, which gives it a name for the window, and last + add account, which makes one and opens a tab to log in. ● marks the one new tabs use; Enter on a row uses it from now on, Backspace on an account asks before removing it. When a token variable such as ANTHROPIC_API_KEY is set where the server runs, a line at the top names it, since it wins over the accounts. What you choose here is kept in account_names and active_accounts; scripts use cornercase account, and the profiles of cornercase profile (profiles, profile).

SettingsWorktreesAgentsAccountsFlowsIssuesUIRemotePluginsArena6 ag…coder A + coder BjudgeintegratorreviewerDiagramBug, test first 4 agentsreproducercodertesterorchestratorCross review 4 agentscoderreviewer + second reviewerclaudeFull issue 5 agentscoderreviewer + securitytesterQuick 3 agentscoderreviewercoder Aowncoder Bownclaudecodex▼judgeclaude▼integratorclaude◀findings·≤2▼reviewercodex▼◆open a pull requesta built-in flow: edit saves your version in your folder, in its place; delete hides iteditduplicateexportdeleteimportnewrestartdone

Flows, teams of agents that work through a plan: one list with the selected flow’s diagram beside it, and edit, duplicate, export, delete, import and new. Tab and ← → switch tabs here, ↑ ↓ move between flows. Deleting a built-in flow hides it (see hidden_flows); deleted built-ins, at the end of the list, brings it back.

SettingsWorktreesAgentsAccountsFlowsIssuesUIRemotePluginsAccountsShortcut API tokennot connectedenter pastes oneLinear API key not connectedenter pastes oneJiraJira site not setsuch as acme.atlassian.netJira email not setthe one you sign in withJira API token not connectedenter pastes oneJira filter noneJQL, such as project = SHOPPlanePlane workspace not setthe part after app.plane.so/Plane URL Plane Cloudfor a self-hosted serverPlane API key not connectedenter pastes onePlane filter nonequery parameters, such as priority=highGitLabGitLab URL gitlab.comfor a self-hosted serverGitLab access token not connectedenter pastes oneAsanaAsana workspace your only onename or IDAsana projects your tasksIDs or links, empty lists your tasks
Row What it sets
Shortcut API token, Linear API key Paste a token and press Enter; cornercase checks it, then saves it to secrets.json. Hover a saved one and click ×, or press Delete, to remove it. When the token comes from an environment variable, the row says so and can’t be changed here.
Jira site, Jira email Your Jira Cloud site, such as acme.atlassian.net (a bare name like acme gets .atlassian.net), and the email of your Atlassian account. The Jira tab of the issue browser asks for both when they are missing.
Jira API token Like the tokens above; the site and the email must be set first, since the token is checked against that site.
Jira filter A JQL condition the Jira tab always applies, such as project = SHOP. Empty lists every issue of the site you can see.
Plane workspace, Plane URL Your Plane workspace, the part of the address after the server’s name (acme in app.plane.so/acme), and the address of a self-hosted server, such as https://plane.acme.dev. Empty means Plane Cloud. The Plane tab of the issue browser asks for the workspace when it is missing.
Plane API key Like the tokens above; the workspace must be set first, since the key is checked against it.
Plane filter Query parameters the Plane tab always adds to its list, such as priority=high or project_id=…&label_id=…. Empty adds nothing; finished work items still need closed.
Asana workspace Your Asana workspace, by name or ID; the row shows its name once the account is known, with the saved ID in the note. Empty means the only workspace your token belongs to; with several, the Asana tab of the issue browser asks which one.
Asana projects The projects whose tasks the Asana tab lists, as IDs or links separated by spaces or commas (saved as IDs). Empty lists the tasks assigned to you.
Asana access token Like the tokens above; it needs no workspace first.
GitLab URL The address of a self-hosted GitLab server, such as https://gitlab.acme.dev. Empty means gitlab.com. The GitLab tab of the issue browser asks for it before the token.
GitLab access token Like the tokens above; it is checked against the server set in GitLab URL.
Sources shown Which tabs the issue browser shows. Click to show or hide one (at least one stays); hover a row and use its ↑ ↓ buttons, or press Shift+↑ Shift+↓, to change the order.
SettingsWorktreesAgentsAccountsFlowsIssuesUIRemotePluginssidebarprojects_on_tophow projects, workspaces and tabs are laid outtabs sidebarwhere a workspace's tabs are listedicon bar [ ] offthe buttons under the lists, as icons; needs a Nerd Fontagents section [ ] hiddenevery running agent in the sidebarworking icon moonon the tab of an agent that is workingcounts [x] shownwhat a project or collapsed group holds, such as (3)TODO dot [x] shownwhile items are pendinginactive panes [x] dimmedin a split tabmodel [x] shownunder an agent's tab, such as Opus 5.5context [x] shownhow full its context is, such as 23%memory [ ] hiddenthe RAM its processes use, such as 1.2 GBaccount [x] shownthe account an agent uses; only once you add an accountaccount switcher [x] showna bar at the bottom; only once you add an accountaccount picker [x] shownin issues, flows and the queue; only once you add an accountdesktop notifications autowhen an agent in another tab needs you or finishessound [x] onalso while you look at cornercase, on the window's computersound when it needs you built-inan absolute or ~/ path on the window's computer; empty: built-insound when it finishes built-inan absolute or ~/ path on the window's computer; empty: built-insound for subagents [ ] offagents started by another agent or by a flowcheck for updates [x] every hourasks GitHub for the latest release
Row What it sets
sidebar How projects, workspaces and tabs are laid out: projects_on_top (the default) and workspaces_on_top stack both lists in one column, side_by_side gives each its own column, and tree shows one list with every project, its workspaces and their tabs. See Arrange the columns.
tabs Where a workspace’s tabs are listed: sidebar (the default) under their workspace, or top in a bar above the pane with only the active workspace’s tabs. See Tabs above the pane.
icon bar Move the buttons at the bottom of the sidebar into a column of icons on the left edge, named when you hover them. They need a Nerd Font, which Ghostty, kitty and WezTerm include. Off by default. See The icon bar.
agents section List every Claude Code, Codex, Gemini CLI, opencode, Grok Build, Cursor CLI and GitHub Copilot CLI, in every project, at the bottom of the sidebar; a click jumps to one. Off by default. See The agents section.
working icon What a working agent’s tab shows: moon (the default), a still yellow ◐, or spinner, ⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ turning about ten times a second. Also in the tab bar and the agents section. See What your agents are doing.
counts Show how many workspaces a project has, such as (3), after its name, and how many projects a collapsed group holds. On by default.
TODO dot Show a grey ● next to the TODO button while items are left to do. On by default.
inactive panes Dim the panes you aren’t typing in, in a split tab.
model Show the model of a Claude Code, Codex, Gemini CLI, opencode, Grok Build, Cursor CLI or GitHub Copilot CLI tab on a second line under its name, such as Opus 5.5.
context Show how full its context is on that line, such as 23%. With the model off too, and the memory off, every tab takes one row. See How full the context is.
memory Show how much memory every tab uses, at the end of an agent’s line or on a second line in a shell tab, such as 1.2 GB. Off by default. See How much memory a tab uses.
account Show the account an agent uses on its second line, such as work. On by default; shown only once you have an account.
account switcher Show a status bar at the bottom of the window with a button per agent, such as claude: work ▾, to choose the account new tabs use. On by default; shown only once you have an account.
account picker Offer an account list when you start an issue or a flow, or schedule one. On by default; shown only once you have an account.
desktop notifications How your terminal tells you that an agent in another tab needs you or finished: auto picks what your terminal understands, osc777, osc9, osc99 or bell force one, off sends none. The toast in cornercase shows either way; see Notifications.
sound Also play a sound when an agent in another tab needs you or finishes, on the computer the window is on, even while your terminal is focused and inside tmux. On by default. See A sound.
sound when it needs you The file played when an agent waits for you or fails: an absolute path or one starting with ~/, read on the window’s computer. Empty plays the built-in one.
sound when it finishes The file played when an agent finishes. Empty plays the built-in one.
sound for subagents Also play it for agents started by another agent or by a flow. Off by default, so only the agents you started make a sound.
check for updates Every hour: ask GitHub for the latest release when the server starts and then hourly, and offer to update when there is a newer one. Never: don’t ask.
star prompt Now and then: after about two weeks of use, a small card at the bottom right asks for a star on GitHub. Never: it never asks. See star_prompt.
prefix key The key that opens the menu of keyboard shortcuts. Select the row, then press the combination you want; Backspace turns it off, Esc keeps the current one. Off by default.

Using cornercase away from the computer: in your phone’s browser, or through Telegram or Discord. Once one of them is set up, a Remote button shows at the right of the Usage row, at the bottom of the sidebar; it opens a menu with each, and shows a green ● while a browser is attached or you are away on a chat app.

SettingsWorktreesAgentsAccountsFlowsIssuesUIRemotePluginsBrowserremote access[ ] offopen this computer's cornercase from your phone over TailscaleTelegrambot not setmake a bot with @BotFather and paste its token hereDiscordbot not setmake a Discord app with User Install and paste its bot token
Row What it sets
remote access Open this cornercase in your phone’s browser over Tailscale: on, Remote › open in your phone’s browser shows a QR code to scan. The note says when it is ready, at which address, or what is missing. Off by default. See From your phone.
paired browsers How many browsers are paired, shown once there is one. Enter forgets them all and disconnects them.
bot Under Telegram, the Telegram bot that messages you while you are away: paste the token @BotFather gave you. Under Discord, the Discord app’s bot token, from the Developer Portal. The note says whether cornercase reaches it. Backspace removes it.
phone The chat paired with the bot, shown once a bot is set. Enter shows a code to scan with your phone (for Discord, the link that adds the app to your account); Backspace forgets the chat.

The plugins you installed with cornercase plugin install or linked with cornercase plugin link, under Installed. Each row shows the plugin’s name and version and whether it is on. While it is off, the note says what it asks for; once on, its description, or whether its service runs. Enter turns it on or off, and the change is saved in plugins.json, not in config.json. A plugin whose manifest cannot be read, or whose command leads out of its folder, says why and cannot be turned on. With no plugin linked, the tab says how to add one.

Plugins run as you, with your rights: what they ask for is shown, not enforced. Other apps read the same rows, and what each service is doing, with the plugin-list request (see Scripts and agents).

Key Does
Enter, Space Change the selected row.
↑ ↓ Select a row. The mouse wheel does the same.
Tab, → / Shift+Tab, ← Next / previous tab.
Shift+↑ Shift+↓ Move the selected source up or down.
Delete, Backspace Remove the selected saved token or chat bot, or forget the paired phone.
Esc Close the modal, or leave a list or a text field.

In a list, type to filter it and press Enter to pick. In a text field, Enter saves and Esc cancels.

Path
Usually ~/.config/cornercase/config.json
With XDG_CONFIG_HOME set $XDG_CONFIG_HOME/cornercase/config.json
With CORNERCASE_SOCKET set config.json next to the socket

Every key is optional: a missing key takes its default. Here is a complete file, as the settings modal writes it after choosing Claude Code in plan mode as the default agent:

config.json
{
"worktrees_dir": "~/.cornercase/worktrees",
"fetch_minutes": 5,
"pull_requests": true,
"merged_pull_requests": true,
"issue_tabs": ["all", "github", "gitlab", "shortcut", "linear", "jira", "plane", "asana"],
"gitlab_url": "",
"jira_site": "",
"jira_email": "",
"jira_jql": "",
"plane_url": "",
"plane_workspace": "",
"plane_filter": "",
"asana_workspace": "",
"asana_projects": "",
"agent": "claude",
"agent_args": {
"claude": ["--permission-mode", "plan"]
},
"agent_modes": {},
"agent_commands": {},
"prompt": "{url}",
"submit": false,
"accept_trust_prompts": false,
"resume_agents": true,
"keep_awake": false,
"hidden_flows": [],
"trust_prompt_pattern": "trust the files|trust this (folder|directory|workspace|repository)|do you trust|yes, proceed",
"gh": "gh",
"glab": "glab",
"sidebar": "projects_on_top",
"tabs": "sidebar",
"icon_bar": false,
"agents_section": false,
"working_icon": "moon",
"counts": true,
"todo_dot": true,
"dim_inactive_panes": true,
"prefix_key": "",
"model": true,
"context": true,
"memory": false,
"account_mark": true,
"account_switcher": true,
"account_picker": true,
"desktop_notifications": "auto",
"sound": true,
"sound_waiting": "",
"sound_done": "",
"sound_subagents": false,
"check_updates": true,
"star_prompt": true,
"remote": false,
"remote_port": 47681,
"projects": {}
}
Key Type Default
worktrees_dir string "~/.cornercase/worktrees"
fetch_minutes number 5
pull_requests boolean true
merged_pull_requests boolean true
issue_tabs array of strings ["all", "github", "gitlab", "shortcut", "linear", "jira", "plane", "asana"]
gitlab_url string ""
jira_site string ""
jira_email string ""
jira_jql string ""
plane_url string ""
plane_workspace string ""
plane_filter string ""
asana_workspace string ""
asana_projects string ""
agent string "auto"
agent_args object {}
agent_modes object {}
agent_commands object {}
prompt string "{url}"
submit boolean false
accept_trust_prompts boolean false
resume_agents boolean true
keep_awake boolean false
hidden_flows array of strings []
trust_prompt_pattern string see below
gh string "gh"
glab string "glab"
sidebar string "projects_on_top"
tabs string "sidebar"
icon_bar boolean false
agents_section boolean false
working_icon string "moon"
counts boolean true
todo_dot boolean true
dim_inactive_panes boolean true
prefix_key string ""
model boolean true
context boolean true
memory boolean false
account_mark boolean true
account_switcher boolean true
account_picker boolean true
desktop_notifications string "auto"
sound boolean true
sound_waiting string ""
sound_done string ""
sound_subagents boolean false
check_updates boolean true
star_prompt boolean true
remote boolean false
remote_port number 47681
projects object {}
profiles object {}
profile string ""
account_names object {}
active_accounts object {}

The folder for new worktrees, checked out in <worktrees_dir>/<repository>/<branch>. An absolute path, or one starting with ~/.

How often, in minutes, each project’s remotes are fetched to show the commits to pull on its workspaces. A whole number; 0 turns fetching and the counts off.

Whether each workspace shows the pull request of its branch and the state of its checks and whether it has merge conflicts, asked of GitHub with gh. On by default. See Pull requests and their checks.

Whether Usage → Stats counts the pull requests and merge requests you opened that were merged, read with gh and glab. On by default; off asks nothing. See Usage and stats.

The tabs of the issue browser, in order. Accepts all, github, gitlab, shortcut, linear, jira, plane and asana, in any case; unknown names and repeats are ignored, and a list with no valid name shows all eight. A list saved before Jira existed gets jira added at the end once, one saved before Plane existed gets plane, one saved before Asana existed gets asana, and one saved before GitLab existed gets gitlab right after github (at the end without it).

The address of your GitLab server, such as "https://gitlab.acme.dev", or one under a path such as "https://acme.dev/gitlab"; a trailing / is dropped. Empty is gitlab.com. Requests carry your token, so they don’t follow redirects: enter the address the server ends up at. An http:// address works too; one that isn’t loopback (localhost, 127.x.x.x or [::1]) gets a warning, since the token then travels unencrypted. The GitLab tab lists the issues of the project whose remote is on this server. Set from the issue browser or the settings modal. The token is never stored here: it goes in secrets.json or comes from GITLAB_TOKEN (see Files and environment).

Your Jira Cloud site, as a host name such as acme.atlassian.net. Set from the issue browser or the settings modal, which also accept a URL or a bare name.

The email of your Atlassian account, sent with the API token to sign in to Jira. The token itself is never stored here: it goes in secrets.json or comes from JIRA_API_TOKEN (see Files and environment).

A JQL condition added to every Jira list, such as project = SHOP or project in (SHOP, API) AND labels = backend. The list is always sorted by last update, so an ORDER BY in it is dropped.

The address of a self-hosted Plane server, such as "https://plane.acme.dev"; a trailing / is dropped. Empty is Plane Cloud (https://app.plane.so). Requests carry your API key, so they don’t follow redirects: enter the address the server ends up at. Set from the settings modal.

Your Plane workspace, the slug in the address after the server’s name: acme in app.plane.so/acme. Lower case letters, numbers and dashes. Set from the issue browser or the settings modal. The API key is never stored here: it goes in secrets.json or comes from PLANE_API_KEY (see Files and environment).

Query parameters added to every Plane list, written as in a URL: priority=high&label_id=…. The parameters are those of Plane’s work item list (state_group, priority, project_id, label_id, cycle_id, …; lists take comma-separated values). They are not checked: when Plane refuses them, its answer is shown in the list. The list asks for the work items that are not done on its own, so a state_group__in here narrows that rather than replacing it: while closed is off only its open groups count, and one that names only finished groups lists nothing.

Your Asana workspace, by name (any case) or ID. Choosing one in the issue browser saves its ID, since two workspaces can share a name; a name that two share is refused, with their IDs. Empty means the only workspace your token belongs to; when it belongs to several and this names none of them, the issue browser asks which one and the Asana tab says so. Set from the issue browser or the settings modal. The access token is never stored here: it goes in secrets.json or comes from ASANA_ACCESS_TOKEN (see Files and environment).

The projects the Asana tab lists, as project IDs or links separated by spaces or commas: "1200000000000001 https://app.asana.com/1/12/project/34/list/56". The settings modal saves them as IDs joined by , . Empty lists the open tasks assigned to you, and then the assignee filter can only be anyone or me.

The default agent: an agent kind such as "claude" or "codex", or "auto" for the agent running in your current tab, and otherwise ask.

The arguments each agent kind starts with, including those of its mode. For example {"claude": ["--permission-mode", "plan"]} starts claude --permission-mode plan.

Extra or replaced start modes for an agent kind: {"kind": {"mode name": ["args"]}}. A mode with the same name as a built-in one replaces it; an empty list hides it.

The program to run for an agent kind, a name on your PATH or a path: {"cursor": "/opt/bin/cursor-agent"}. A kind that cornercase doesn’t know adds a new agent.

The prompt template handed to an agent started on an issue. Placeholders such as {url}, {title} and {branch} are filled in.

true sends the prompt for you; false leaves it typed at the agent’s prompt for you to send.

Whether cornercase answers yes to the agent’s “do you trust this folder?” question when it starts one. Off by default: you answer, and the prompt waits until you have. Older versions called this key auto_accept_trust_prompt and had it on; that key is ignored now, so it is off until you turn it on again. See Trust prompts.

Whether a pane that ran Claude Code, Codex, Gemini CLI, Grok Build, Cursor CLI or GitHub Copilot CLI comes back in the same conversation when a new server restores your session: cornercase types claude --resume <id>, codex resume <id>, gemini --resume <id>, grok --resume <id> or cursor-agent --resume <id> or copilot --resume=<id> into its new shell, with the agent’s command and arguments and the mode it was running in. On by default. See Agents resume their conversations.

Whether the computer stays awake while an agent is working. Off by default. See Keep the computer awake.

The names of the built-in flows you deleted in Settings → Flows, compared ignoring case and surrounding spaces. They leave Settings, the start dialog and cornercase flow list, and cornercase flow run refuses them; a deleted name stays reserved, so a project’s flow named like one does not run. A name that matches no built-in flow is ignored, and the list is kept across updates. Remove a name here, or use deleted built-ins in Settings → Flows, to bring the flow back.

The regular expression, matched without regard to case against the last 15 non-blank lines of the agent’s screen, that recognises a trust question. The default is:

trust the files|trust this (folder|directory|workspace|repository)|do you trust|yes, proceed

The GitHub CLI to run for GitHub issues and for the pull requests of workspaces: a name looked up in your PATH, or a path, which may start with ~/.

The GitLab CLI to run for the merged merge requests of Stats: a name looked up in your PATH, or a path, which may start with ~/.

How projects, workspaces and tabs are laid out: "projects_on_top" and "workspaces_on_top" stack both lists in one column, the first one named on top; "side_by_side" gives each its own column; "tree" shows one list with every project, its workspaces and their tabs. An unknown value counts as the default, "projects_on_top"; before 0.9.0 the default was "side_by_side", and a config.json that already names it keeps it. It applies from 90 columns up; below that the compact layout shows one list at a time.

Where a workspace’s tabs are listed: "sidebar" under their workspace, in the workspaces list or the tree; "top" in a bar above the pane, with only the active workspace’s tabs and, on a second line, the model and context of the one on screen. An unknown value counts as the default, "sidebar". It applies from 90 columns up; the compact layout always lists the tabs in its menu. See Tabs above the pane.

Whether the buttons at the bottom of the sidebar become a column of icons on the left edge, from 90 columns up, and the compact layout’s top bar and the panels’ search buttons use the same icons. The icons come from Nerd Fonts: Ghostty, kitty and WezTerm include them, other terminals need a Nerd Font set as their font. See The icon bar.

Whether the sidebar ends with a list of every Claude Code, Codex, Gemini CLI, opencode, Grok Build, Cursor CLI and GitHub Copilot CLI running in any project, with what each is doing, its model and context; a click on one jumps to it. In every layout; below 90 columns it is a third menu. See The agents section.

What the tab of a working agent shows, also in the tab bar and the agents section: "moon", a still ◐, or "spinner", ⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ turning about ten times a second. An unknown value counts as the default, "moon". See What your agents are doing.

Whether a project shows how many workspaces it has after its name, such as (3), and a collapsed group how many projects it holds.

Whether the TODO button shows a grey ● while at least one item is left to do (☐ ● in the compact layout’s top bar). It never shows a number, and goes away once every item is done or the list is empty. See TODO list.

Whether panes you aren’t typing in are dimmed, in tabs split into several panes.

The key that opens the menu of keyboard shortcuts, such as "ctrl+]", "alt+k" or "f12": modifiers (ctrl, alt, shift) joined by +, then a character, space or a function key. Ctrl or Alt is needed except for function keys, and ctrl+c, ctrl+d and ctrl+z are refused. Empty, the default, or anything that can’t be a prefix leaves keyboard shortcuts off.

Whether a Claude Code, Codex, Gemini CLI, opencode, Grok Build, Cursor CLI or GitHub Copilot CLI tab shows its model on a second line under its name, such as Opus 5.5. When the file has no model, it takes the value of context, so a line turned off in 0.6 stays off.

Whether that line shows how full the agent’s context is, such as 23%, after the model. With model, context and memory all false, every tab takes one row. cornercase 0.6 called it context_line, and it hid the model too; that key is still read.

Whether every tab shows how much memory its processes use on its second line, such as Opus 5.5 · 23% · 1.2 GB, or 1.2 GB alone in a shell tab or with model and context off. While it is true, the tabs of the project on screen are measured every 2 seconds; in the tree, those of every open workspace. See How much memory a tab uses.

Whether an agent’s tab, the tab bar and the agents section name the account it uses, such as Opus 5.5 · work · 12%. Nothing shows while you have no account, whatever this says.

Whether a status bar along the bottom of the window shows a button per agent with accounts, such as claude: work ▾, to choose the account new tabs use. The panes give it one row while it shows. Nothing shows while you have no account.

Whether the dialogs that start an issue or a flow, and the schedule form, offer an account list for the agents that have accounts. Off, they use the accounts in use. Nothing shows while you have no account.

How cornercase asks your terminal for a desktop notification when an agent in another tab needs you or finishes: "auto" picks it from each terminal, "osc777", "osc9", "osc99" or "bell" forces one, and "off" sends none. An unknown value counts as "auto". The toast inside cornercase shows either way; see Notifications.

Whether cornercase also plays a sound when an agent in another tab needs you or finishes: at the same moments as the toast, once the state has held for a second, never for the tab you are looking at. It plays on the computer the window is on, whatever your terminal does with notifications, so it is heard while Ghostty is focused and inside tmux, screen or Zellij; with cornercase remote it plays on your laptop. A window opened in a plain SSH session (ssh -t host cornercase) plays none, since it would play on the other computer. It does not depend on desktop_notifications, which can be "off". On macOS it uses afplay; on Linux the first of pw-play, paplay and aplay found. On by default. See A sound.

The file played when an agent waits for you or fails. "" (the default) plays the built-in one. The path must be absolute or start with ~/, your home folder on the window’s computer, where it is read; Settings refuses any other. A file that is missing or cannot be read plays the built-in one. afplay plays most formats; on Linux use WAV with aplay, or WAV, OGG or FLAC with pw-play and paplay.

The file played when an agent finishes, the same way as sound_waiting. "" plays the built-in one, which sounds different from the other, so you can tell them apart without looking.

Whether the sound also plays for agents started by another agent (with cornercase start, new-tab or split run in its pane) or by a flow, the ones the agents section hangs under another. false by default: only the agents you started make a sound, and the others still get their toast and notification. An agent whose parent closed counts as one you started.

Whether cornercase asks GitHub for the latest release, when the server starts and then every hour, to offer an update. Only a request for the latest release is sent, and, once a newer one is out, a download of its changelog for the update dialog; nothing about you. Builds made with cargo run never check. An explicit check, cornercase update --check or a program’s update-check, asks GitHub whatever this setting says.

Whether cornercase may ask for a star on GitHub. After about 14 days on which a window was open and an agent ran (not calendar days since you installed it), a small card appears at the bottom right of the window: star on GitHub copies the repository’s link to your clipboard and never asks again, later asks again in about 90 days, and don’t show again never asks again. If you don’t answer, it counts as later. It never appears while an agent is working or waiting for you, while a dialog, the search or a panel’s field has the keys, or in the compact layout (below 90 columns), and it never takes the keys from the pane. Nothing is sent anywhere and cornercase doesn’t check whether you starred; what it remembers (the days counted, when it last asked and your answer) is in star.json next to session.json. Set it to false to turn it off for good.

Agents explains agent, agent_args, agent_modes, agent_commands and the trust prompt in depth.

Whether this cornercase can be opened in a browser over Tailscale, from a phone that scans the code the Remote button shows. Off by default. See From your phone.

The port cornercase listens on for browsers, on your computer only (127.0.0.1); tailscale serve passes Tailscale’s port 8443 to it. Change it when something else uses 47681.

Per-project commands, keyed by the project’s folder (~/ is expanded): setup runs in the first tab of each new worktree before its agent starts, teardown runs before a worktree is removed. Edit them in the project’s ⋯ menu, project settings; an entry with both empty is removed.

"projects": { "~/code/web-shop": { "setup": "npm ci\ncp ../.env .env", "teardown": "docker compose down" } }

Your profiles: for each, the account each agent uses. Left out of the file while you have none. Manage them with cornercase profile.

"profiles": { "Work": { "claude": "work", "codex": "work" }, "Home": { "claude": "personal" } }

The active profile, whose accounts new tabs and agents start with. Empty, the default, means no profile: each agent uses the account in active_accounts, else its usual login. A name that is not in profiles counts as empty. cornercase profile use changes it, and an edit to the file applies at once. Choosing an account in the window empties it.

The names the window shows for your accounts, per agent; "" is the agent’s own login, which is otherwise called System, and an account without one shows its folder’s name. The folders never move. Left out of the file while you have none. rename… in Settings › Accounts and cornercase account rename change it.

"account_names": { "claude": { "": "work", "personal": "Personal" } }

The account each agent’s new tabs start with while no profile is active; an agent left out uses its usual login. Left out of the file while it is empty. The buttons above Usage, Enter in Settings › Accounts and cornercase account use change it; cornercase profile use --system empties it.

"active_accounts": { "claude": "personal" }
config.json
{
"worktrees_dir": "~/work/trees",
"issue_tabs": ["github", "linear"],
"agent": "codex",
"agent_args": {
"codex": ["--sandbox", "workspace-write"],
"mine": ["--fast"]
},
"agent_modes": {
"claude": { "auto": [] }
},
"agent_commands": {
"mine": "/opt/bin/my-agent"
},
"prompt": "Work on {url} ({title}). You are on branch {branch}; start with a failing test.",
"submit": true,
"dim_inactive_panes": false
}

This keeps worktrees in ~/work/trees, shows only the GitHub and Linear tabs, starts Codex in its workspace write sandbox by default, hides Claude Code’s auto mode, adds a custom agent called mine, sends a fuller prompt for you, and keeps every pane equally bright.