Finishes #376. The contributed keystroke tracker sat on the raw byte stream and named tabs wrong five ways (every prompt, every write path, a bare Esc eating the next prompt's first character, pasted newlines as Enter, any CSI clearing the draft) and replaced the whole name, which dropped the case from the tab and reset the w<n> counter. This lands the feature with each of those closed: - First prompt means the first: applyAutoName() flips a placeholder to `auto` whether or not the string changed. nameSource is now the tri-state placeholder | auto | manual; the name setter is the only manual path. - Only user-originated input counts: write()/writeViaMux() take SessionWriteOptions.fromUser, set by the browser WS path and POST /input only, so Ralph, respawn, cron, approvals and the trust-dialog keys can never name a tab. A startMode 'shell' CLI never feeds the tracker (a capability, not an id check); the send-key route feeds trackUserInput() because its line feed bypasses the session. - Prefix form `w3-case: title`: parseSessionPrefix() already renders it as the title with the prefix in the tooltip and the next-session counter still matches it. Composed within MAX_SESSION_NAME_LENGTH. - Tracker rules per key: bare Esc resolves at chunk end; mouse/focus reports, Tab, cursor keys, Shift+Tab are no-ops; Up/Down and Ctrl+P/N/R taint the draft so Enter submits nothing rather than a fragment; bracketed-paste newlines and Ctrl+J / Shift+Enter join with one space; the draft keeps its head past 8192 code points; an escape past 64 bytes is abandoned. - Title: slash commands by shape (a path is a prompt), `!` escapes refused, first sentence only past 8 code points ("e.g." is not a title), 72 code points on a word boundary. - Synced `autoNameSessions` setting, default OFF (the prompt reaches mux-sessions.json, session:updated and /api/search), App Settings -> Appearance -> Tabs, read fresh per prompt after the eligibility check. Tests: test/session-auto-name.test.ts (tracker, title, composition, ownership, emit gating), the wiring test (once, prefix, setting off, manual protected), test/routes/session-name-routes.test.ts (PUT /name flips to manual and persists). Verified live on an isolated instance: API and browser-typed prompts name the tab, a second prompt does not, shells and renamed tabs are untouched, nameSource survives a restart. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
11 KiB
Settings Reference
Two settings surfaces, and the rule that explains why a setting you changed on your laptop did not follow you to your phone.
| Surface | Scope | Opened from |
|---|---|---|
| App Settings | Global, this Codeman install. | The header gear. |
| Session Options | One session. | The session's tab. |
App Settings is a single scrolling document with a rail acting as a table of contents; clicking a rail entry scrolls rather than switching. Session Options genuinely switches panels.
Per-device versus synced
Some settings live on the server and follow you to every device. Others are stored in the browser and stay put. This is deliberate, not an oversight: your phone wants a different font size, a different keyboard bar, and a different set of header buttons than your desktop.
| Category | Examples |
|---|---|
| Per-device, local | Skin, WebGL renderer, local echo, CJK input, extended keyboard bar, File Viewer and Cron header buttons. Never sent to the server at all. |
| Per-device policy | Most show* toggles, plan usage chip, language. Stored server-side, but a device only takes the server value when it has no local one of its own. |
| Synced | Models, effort, CLI options, notification preferences, voice settings, display name, the agent skill and approvals toggles. |
The practical rule: appearance and input are per device, behaviour is shared. If a change did not follow you, it is in one of the first two rows, and you change it again on that device.
App Settings
Updates
Current version, a manual check, and the in-app updater. Covers git-clone installs supervised by systemd or launchd; npm installs report as non-updatable. See Running As A Service.
Terminal & Input
| Setting | Default | Notes |
|---|---|---|
| Local Echo | On for touch devices | Paints keystrokes locally and flushes on Enter. See Input And Voice. |
| CJK Input | Off | IME composition through a dedicated text field. |
| Extended Keyboard Bar | Per device | Which accessory bar phones get. Shell sessions override it while they are active. |
| Wheel Scrolls Local History | Off | Keeps the wheel on the local buffer instead of forwarding it to the CLI. |
| Auto Copy Selection | Off | Copies highlighted terminal text to the clipboard the moment you finish selecting it. Ctrl+C still copies on demand. |
| WebGL Renderer | On | With a GPU-stall watchdog that falls back to DOM rendering. |
| Gesture Control | Off | Camera hand tracking. Also needs CODEMAN_GESTURE=1 on the server. |
Header & Panels
Chips for every optional header control, with a live preview of the resulting header:
Run, Font Size, System Stats, Redraw Terminal, Response Viewer, Away Digest, Session Manager, Attachments, File Viewer, Multi-monitor, Plan Usage, Lifecycle Log, Monitor, Project Insights, File Browser, Subagents, Approvals Inbox, Read My Mind, Ultracode Agents, Ultracode Windows, Cron.
Most default to off. The stock desktop header is system stats, File Viewer, and the gear. New header controls never appear on phones.
This section also holds background-agent tracking, including whether to track agents for every session or only the active tab.
Appearance
| Setting | Notes |
|---|---|
| Skin | Theme palettes, light ones included. Applied before first paint, so no flash of the wrong theme. |
| Entrance Animations | Per-surface animation styles for tabs, terminals, windows, and lineage lines. All default to the legacy no-animation behaviour. |
| Display Name | Your name in the UI. Cosmetic only; it never renames the package, CLI, API, or storage. |
| Interface Language | English or Simplified Chinese. Per device. |
| Session List Layout | Header tab strip (default) or a collapsible left sidebar. See The Dashboard. |
| Tall Tabs | Taller tab strip. |
| Pop-out Button on Tabs | Adds the detach control to tabs, with a per-tab override. |
| Spawn Lineage Lines | Arcs from a parent tab to sessions it spawned. Desktop only, on by default. |
| Auto-name Sessions | Titles a new tab after its first prompt, keeping the case prefix (w3-myapp: fix the login redirect). Synced, off by default. See The Dashboard. |
| Overview Home Screen | The phone home screen. On by default. |
Models
Claude model cards, the 1M context window switch, and the thinking effort segment. The cards and the switch compose into one model choice, so there is no separate "which one wins" question.
Model and effort are both soft defaults: the model is written into the case's
.claude/settings.local.json and effort is passed at start, so /model and /effort
inside a session override them at any time.
Agents & CLIs
| Setting | Notes |
|---|---|
| Startup Mode | Claude's permission mode for new sessions. Default skips prompts; auto uses Anthropic's classifier-guarded mode; normal prompts; or give an explicit allowed-tools list. |
| Allowed Tools | The list used by the explicit mode. |
| Ralph / Todo Tracker | Enables the Ralph loop surfaces. |
| Agent Teams | Experimental teams. Also needs the CLI's own environment flag. |
| Codeman Agent Skill | Injects the agent skill into new Claude sessions per case. Off by default. See Driving Codeman From An Agent. |
| Remote auto-reconnect | Reattaches dropped remote SSH sessions. On by default. |
| Nice priority / value | Runs agent processes at a lower CPU priority. |
| Bypass approvals and sandbox | Pi's project trust. Read Agent CLIs before enabling. |
| Animated status effects | Cosmetic. |
Notifications
Master toggle, browser notifications, push subscription, audio alerts, and the idle threshold that decides when a quiet session counts as needing you. See Notifications And Approvals.
Voice
Active provider and the engine behind it, insert mode, language, domain keywords to bias recognition, the Deepgram API key, and the opt-in switch for transcribing through this server's Claude login, with its live credential status. See Input And Voice.
Shortcuts
Rebinding for the shortcut registry. See Keyboard Shortcuts.
System
CLAUDE.md template for new cases, default working directory, the image watcher, and
Cloudflare tunnel controls including the tunnel and upload URLs. In multi-user mode, the
Users administration entry is injected here.
Session Options
Per session, from the tab.
| Panel | Contains |
|---|---|
| Respawn | Auto-resume on usage limit, the respawn cycle configuration, presets, duration. See Keeping Agents Running. |
| Session | Name, working directory, environment overrides, per-tab pop-out override. |
| Ralph / Todo | Loop configuration, iteration and todo caps, circuit breaker reset. See Autonomous Loops. |
| Summary | What this session has done: tokens, activity, run summary. |
Panels that only make sense for Claude are hidden for other run modes rather than shown and failing.
Environment variables
Some things are configured before the server starts, not in the UI:
| Variable | Effect |
|---|---|
CODEMAN_PORT |
Listen port. |
CODEMAN_HOST |
Bind address. Loopback by default. |
CODEMAN_PASSWORD / CODEMAN_USERNAME |
HTTP Basic credentials. Username defaults to admin. |
CODEMAN_ALLOWED_HOSTS |
Extra Host and Origin allowlist entries for a reverse proxy. |
CODEMAN_INSTANCE |
Scopes the data directory and tmux socket together. Required for a second instance. |
CODEMAN_MULTIUSER |
Enables multi-user mode. |
CODEMAN_GESTURE |
Makes gesture control available to be enabled. |
CODEMAN_DOCKER_BRIDGE_HOOKS |
Lets in-container hooks reach the host on a loopback bind. |
CODEMAN_FILE_PICKER_ROOTS |
Extra roots for the path picker. |
CODEMAN_ALLOW_UNAUTHENTICATED_NETWORK |
Acknowledges exposing the server with no password. |
Gotchas
- A setting that did not sync is per device. Change it again on that device.
- The plan usage chip and its telemetry exporter are one setting. Enabling the chip without the exporter would leave it blank forever, so it is deliberately not separable.
- Toggling a header button does nothing on a phone. Phones deliberately ignore most of the header chips.
- Enabling a feature does not retroactively configure existing sessions. The agent skill injection, for instance, applies at session creation.
Read next
- The Dashboard - what each control does once visible.
- Keeping Agents Running - the Respawn panel in depth.
- Agent CLIs - model, effort, and permission modes.