Settings

What the terminal itself acts on. Eight keys, and that is all of them.

// profile.config.ts
export default defineProfile({
    settings: {
        theme: "gruvbox",
        icons: "auto",
        paths: ["~/git/work/agents"],
        verbosity: { session: "normal" },
        padding: 0,
        telemetry: false,
    },
})

The set is closed on purpose. Each key has a meaning the platform enforces — theme names a registered theme, paths are scanned for agents — so an unknown key is a typo rather than a preference nobody reads. An open bag would make "is this setting doing anything?" unanswerable, which is the question a settings file exists to answer.

Extension settings live outside this, as their own top-level key on the profile config ("@cody/vim": { leader: "," }). An extension's settings are its own contract, and keeping them separate means a new platform key can never collide with one an extension already chose.

theme

export default defineProfile({
    settings: {
        // A built-in, or one an extension registered.
        theme: "gruvbox",
    },
})

The active theme, by the name it was registered under — a built-in, or one an extension registered with theme.create().

This is the one setting with a command behind it: picking a theme with " writes this line. Editing it by hand and picking it in the TUI are the same act.

icons

export default defineProfile({
    settings: {
        // "auto" | "nerd" | "unicode" | "none"
        icons: "auto",
    },
})

Which glyph set line components draw from.

A setting rather than code because it answers "what does this machine's font support" — a property of the terminal, not of the config. A line you share should look right on a laptop with a patched font and on a server without one, which cannot be true if the answer is compiled into the line.

auto is a heuristic, not a fact. A font cannot be detected from inside a terminal, so it reads the same environment the ecosystem does (TERM_PROGRAM, and whether a font name mentions "Nerd") and falls back to unicode when nothing says yes. The default is auto rather than off because Nerd Fonts are the de facto standard — lualine, starship, powerlevel10k and oh-my-posh all assume one — so defaulting them off would give most people a plainer bar than they installed a patched font for.

Seeing boxes? Set unicode. Seeing plain text where you expected glyphs? Set nerd.

paths

export default defineProfile({
    settings: {
        paths: ["~/git/work/agents", "~/experiments"],
    },
})

Extra directories scanned for agent projects, beyond profiles/<your-email>/agents/. ~ expands to your home directory.

Additive — the profile's own agents/ is always scanned. See agents/.

verbosity

export default defineProfile({
    settings: {
        verbosity: {
            // "quiet" | "normal" | "verbose"
            session: "normal",
            kernel: false,
            cognet: false,
        },
    },
})

What the timeline shows. The debugging dial: every default is the everyday view, and turning a channel on interleaves the machinery's own records into the conversation.

keydefaulteffect
session"normal"quiet: errors only. normal: + info, like reloads. verbose: + plumbing.
kernelfalseInterleave kernel:* telemetry — runs, engine calls.
cognetfalseInterleave cognet:* telemetry — ticks, phases, systems.

padding

export default defineProfile({
    settings: {
        padding: 1,
        // Each overrides `padding` on its own axis.
        "padding-inline": 4,
        "padding-block": 0,
    },
})

Blank space around the whole terminal UI, in cells. padding is shorthand for both axes; the per-axis keys override it where present, so { padding: 1, "padding-inline": 4 } reads as one row top and bottom, four columns each side.

The CSS names are spelled exactly. This config layer speaks CSS — VTerm mimics browser CSS, and you write scoped CSS in your own extensions — so where CSS already has a name for a thing, these settings use it verbatim rather than a near-synonym. There is nothing to translate between what you write here and what you write in a stylesheet.

padding-block is added to the layout's own one-row top offset rather than replacing it, so 0 is the shipped look. The status line is the bottom edge and sits flush by design; this is what lifts it off.

telemetry

export default defineProfile({
    settings: {
        telemetry: false,
    },
})

Not wired to anything yet. The key is accepted and stored, and nothing reads it. It is listed here because a settings page that quietly omitted a key you can see in your own config would be answering the wrong question — and because setting it today does nothing, which is worth knowing before you set it.

Edited by hand, or by command

Both work, and both take effect on save — the terminal watches the file. " writes theme; everything else is yours to edit.

See also

profile.config.ts — the file these live in, and what else it declares. Policy — the other top-level block, and a very different kind of setting.