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