desk.json

Every key of the desk settings file desk.json, with its type, default, whether a change applies live or at restart, and the settings page row that edits it.

desk.json is the desk's own settings file. It lives at <project>/.smith/desk/desk.json, in the project the desk was started on. A missing file reads as empty. A fresh desk is seeded with {"conductor_name":"smith","conductor_persona":true}.

It is decoded strictly (decodeDeskProject): an unknown key, a bad conductor_pronouns, a bad search.runs_on or a relative data_dir stops the core. Relative paths in it are taken from the project. A name=path entry in project_roots is left as written. A flag given on the command line beats the same key in this file.

Only the 15 settings marked restart below apply when smith starts; every other key applies live, with no restart. The list is notLiveSettings in internal/cli/desk_settings.go; a test keeps this page in step with it. The command line's --listen is the only other start-only setting and is not in desk.json. "Not checked" means the Go code does not settle the value. Tables list the key's type, default, whether it applies live or at restart, and the settings page row (group › row label) that edits it.

For the harness file see harness-json. For search see on-disk.

01keys#

patch_root

type default applies settings page
string, a path <project>/.smith/desk/patch restart assets & storage › patch folder

The patch folder the board api serves. See on-disk.

harness_config

type default applies settings page
string, a path none, so no file is read; each linked project still launches with its own slug, workspace and checks and smith's defaults for the rest restart system › runs settings file

The runs settings file, harness-json. The --harness-config flag wins over it. The file must exist when desk.json is saved.

writable_roots

type default applies settings page
list of paths none restart runs & checks › writable folders

Folders work nodes may write in. The workspace clone must be one of them.

project_roots

type default applies settings page
list of paths or name=path none restart assets & storage › project folders

Folders whose patches show on the board.

library_root

type default applies settings page
string, a path not checked restart not on the settings page

The folder of library templates the desk reads. The --library-root flag wins.

template_root

type default applies settings page
string, a path not checked restart not on the settings page

The folder of the operator's own templates. The --template-root flag wins.

work_app_url

type default applies settings page
string, a url not checked restart not on the settings page

The address of the work app the board links to. The --work-app-url flag wins.

memory_app_url

type default applies settings page
string, a url not checked restart not on the settings page

The address of the memory app the board links to. The --memory-app-url flag wins.

conductor_name

type default applies settings page
string conductor (a fresh desk is seeded with smith) live conductor › name

What the desk calls the conductor.

conductor_pronouns

type default applies settings page
string: she, he, they or it it live conductor › pronouns

How the desk speaks of the conductor in object and possessive slots. Any other value is refused.

conductor_effort

type default applies settings page
string: low, medium, high, xhigh or max unset: the claude CLI's own setting live conductor › effort

The thinking level chats start at. The decoder does not check the value.

conductor_persona

type default applies settings page
bool false live not on the settings page

Puts the built-in conductor persona in the brief. Only the seeding of a fresh desk sets it.

explain_as_you_go

type default applies settings page
bool on (unset means on) live not on the settings page

Whether the manager explains each feature the first time it uses it.

side_chat_ttl_days

type default applies settings page
number 3 (unset or 0); negative turns it off live not on the settings page

How many idle days archive a side chat.

chat_sends_need_card

type default applies settings page
bool false live conductor › chat-to-chat sends

Makes delegate, message_chat and handoff wait for the operator's send on a card; off, they go at once.

ticket_views

type default applies settings page
list of {name, project, hash}, kept as raw json none live not on the settings page

The tickets page's saved views. The page owns the shape; the decoder keeps it as written.

conductor

type default applies settings page
object all keys unset live see each conductor.* key

The conductor block. Its keys are below; conductor.disabled, conductor.memory_dir and conductor.project_memory_dir apply at restart.

conductor.command

type default applies settings page
string, a path claude, found on PATH or in the usual install folders live not on the settings page

The claude binary. Setup step 1 saves an off-PATH find here.

conductor.runtime

type default applies settings page
string: claude, codex or grok claude live not on the settings page

Which CLI the conductor runs on. grok is refused.

conductor.dir

type default applies settings page
string, a path the project live conductor › working folder

Where sessions run. The CLI keys its memory by this folder.

conductor.model

type default applies settings page
string the claude CLI's default live conductor › model

The model the conductor's sessions run on.

conductor.brief_file

type default applies settings page
string, a path none live not on the settings page

A file appended to the desk's neutral brief.

conductor.idle_minutes

type default applies settings page
number 20 on the settings page (from settings.js; not checked in Go) live conductor › idle after

A quiet session is closed after this many minutes and resumes on the next message.

conductor.compact_window

type default applies settings page
number, tokens 400000 live not on the settings page

The token count the CLI auto-compacts near.

conductor.compact_at

type default applies settings page
number, tokens 200000 live not on the settings page

The context size at which the desk compacts at a break.

conductor.on_full

type default applies settings page
string: ask, compact or fresh ask live conductor › when a manager fills up

What a manager chat does at compact_at.

conductor.disabled

type default applies settings page
bool false restart conductor › turned off

When on, nobody answers in the desk and messages are kept. The conductor and its memory tools are set up when smith starts.

conductor.mcp_servers

type default applies settings page
object of server name to mcp-config entry none live not on the settings page

Extra MCP servers for the conductor. The name of the desk's own tickets server is reserved and refused.

conductor.allowed_tools

type default applies settings page
list of strings, as mcp__<server>__<tool> none live skills › tools on its servers

The read tools on those extra servers the conductor may call, by full name. The row label uses the conductor's possessive pronoun.

conductor.builtin_tools_on

type default applies settings page
list of strings none live not on the settings page

Claude built-ins the desk turns off by default (Workflow, ScheduleWakeup, ReportFindings, ListAgents) that stay on.

conductor.memory_dir

type default applies settings page
string, an absolute path empty: smith's own store restart memory › memory folder

The one folder the conductor may write. It is not resolved against the project.

conductor.project_memory_dir

type default applies settings page
string, an absolute path empty: <data dir>/memory-projects restart not on the settings page

The root of the per-project and per-area memory folders. It must exist and sit outside the project. With conductor.memory_dir set, a memory_write with no scope goes to the memory folder, and project or area only when asked for with a scope. See memory-layers.

conductor.news_window_seconds

type default applies settings page
number, seconds 0: no wait live not on the settings page

How long run news is batched before it may start a conductor turn.

assets

type default applies settings page
object both keys unset live see each assets.* key

The model that keeps asset metadata up to date.

assets.model

type default applies settings page
string, provider/name anthropic/claude-haiku-4-5 live not on the settings page

The cheap model that suggests an asset's about and version note.

assets.auto_accept

type default applies settings page
bool false live not on the settings page

Writes the model's about and note on snapshot assets at once, marked as the model's.

backup

type default applies settings page
object all keys unset live see each backup.* key

Where, how often and how many backups of everything smith keeps. The block itself is only a container: its three keys apply at restart, because the schedule starts when smith starts.

backup.dir

type default applies settings page
string, a path ~/smith-backups restart not on the settings page

The backups folder. A mounted share works.

backup.every_hours

type default applies settings page
number 24 (unset or 0); negative turns the schedule off restart not on the settings page

Hours between scheduled backups. Backups before a restart and by hand still happen.

backup.keep

type default applies settings page
number 7 (unset or 0) restart not on the settings page

How many backups stay.

discord

type default applies settings page
object or null none live system group and the discord page; not checked

Puts gates, launch cards and proposals in a channel and takes the operator's presses there. It holds no token. Each project's server is its own binding, kept in the project's settings.

discord.operator

type default applies settings page
string, a discord user id none; without it the feature is off live not on the settings page

The one operator whose presses count.

discord.token_env

type default applies settings page
string, an env var name SMITH_DISCORD_BOT_TOKEN live not on the settings page

The env var the bot token is read from.

discord.token_file

type default applies settings page
string, a path none live not on the settings page

A file the bot token is read from when the env var is empty.

discord.chat

type default applies settings page
string, a conversation id or project none live not on the settings page

The chat the operator's direct messages talk to.

discord.enabled

type default applies settings page
bool on (absent means on) live not on the settings page

The master switch of the discord session.

discord.channel

type default applies settings page
string none live not on the settings page

Kept so an old desk.json still reads. The bridge no longer reads it.

discord.channel_chat

type default applies settings page
bool false live not on the settings page

Kept so an old desk.json still reads. Free chat is each project's binding's now.

trackers

type default applies settings page
list of {name, url, token_file} none live not on the settings page

The remote ticket trackers beside the built-in local one. Names are unique and non-empty, local is the built-in's, and every tracker needs a url. Each project lives in exactly one tracker.

trackers[].name

type default applies settings page
string none live not on the settings page

The tracker's name.

trackers[].url

type default applies settings page
string, a url none live not on the settings page

The tracker's address. Required.

trackers[].token_file

type default applies settings page
string, a path none live not on the settings page

A file holding the bearer token. desk.json holds no token. The file is read when the core starts and whenever the trackers change.

data_dir

type default applies settings page
string, an absolute path the OS default restart not on the settings page

Where smith keeps its tickets, memory and assets. See on-disk. A relative path is refused.

report

type default applies settings page
object unset live see report.url

Where crash reports and issues go once this install is linked.

report.url

type default applies settings page
string, a url https://smith.boxsie.co.uk live system › report url

Reports post to <url>/api/install/link and <url>/api/report. It holds no key.

type default applies settings page
object: runs_on, ollama_url, ollama_model on-disk's live search group

What search everything matches by, and the model it uses. The defaults and values are on on-disk.