Reference
Settings¶
Generated page
Generated from the source by scripts/docs/build-reference.js; edit the code, not this page. It lists the shipped client defaults and the control that edits each field. A saved account or a request may hold other values; the precedence below says which one a turn uses.
Shipped client defaults¶
The values a new profile starts with, from DEFAULT_SETTINGS in public/app.js. Control is the element in Settings that edits the field, read from readSettingsFromForm; a field without one is kept from the saved settings or written by the page's own logic (setup cards, the decision-model cards, tests of a connection). Credential marks a field the secret broker holds in encrypted account storage: saved secrets are returned to the page as references. The Settings save endpoint accepts newly entered credentials; ordinary turn requests cannot override the account credentials.
| Setting | Shipped default | Control | Credential |
|---|---|---|---|
permissionMode |
auto |
#defaultPermissionModeSelect | |
permissionsEnabled |
true |
#permissionsEnabledToggle | |
completionSoundEnabled |
true |
#completionSoundToggle | |
mainProvider |
custom |
#mainProviderSelect | |
baseUrl |
empty | #baseUrlInput | |
apiKey |
empty | #apiKeyInput | yes |
braveApiKey |
empty | #braveApiKeyInput | yes |
model |
empty | — | |
decisionsEnabled |
false |
#decisionsEnabledToggle | |
decisionsProvider |
typesafe |
#decisionsProviderSelect | |
decisionsBaseUrl |
empty | — | |
decisionsApiKey |
empty | #decisionsApiKeyInput | yes |
decisionsModel |
empty | — | |
decisionsActive |
jev |
— | |
decisionsLayaBaseUrl |
empty | #layaBaseUrlInput | |
decisionsLayaApiKey |
empty | #layaApiKeyInput | yes |
decisionsLayaModel |
empty | — | |
imageGeneration |
{"enabled":false,"activeServerId":"","servers":[]} |
— | |
temperature |
null (no override; the provider's default) | #temperatureInput | |
reasoningControl |
auto |
#reasoningControlSelect | |
reasoningEffort |
high |
#reasoningEffortSelect | |
codingProvider |
main |
#codingProviderSelect | |
codingBaseUrl |
empty | #codingBaseUrlInput | |
codingApiKey |
empty | #codingApiKeyInput | yes |
codingModel |
empty | — | |
codingTemperature |
null (no override; the provider's default) | #codingTemperatureInput | |
codingEnableThinking |
true |
— | |
codingReasoningControl |
auto |
— | |
codingReasoningEffort |
high |
— | |
classifierProvider |
main |
#classifierProviderSelect | |
classifierBaseUrl |
empty | #classifierBaseUrlInput | |
classifierApiKey |
empty | #classifierApiKeyInput | yes |
classifierModel |
empty | — | |
classifierTemperature |
0 |
— | |
themeId |
nawa-dark |
#themeSelect | |
transcriptView |
normal |
#transcriptViewSelect | |
llmPresets |
empty list | — | |
activeLlmPresetId |
empty | — | |
providerConnectionMemory |
{} |
— | |
skillMatcherSettings |
{"profile":"classifier","baseUrl":"","apiKey":"","model":"","temperature":0,"maxTokens":512,"enableThinking":false,"reasoningControl":"auto","reasoningEffort":"off"} |
— | |
enableThinking |
true |
— | |
webSearchEnabled |
true |
— | |
disabledConnectors |
empty list | — | |
maxParallelAgents |
4 |
#maxParallelAgentsInput | |
stageRepairAttempts |
3 |
#stageRepairAttemptsInput | |
chatDirectory |
./data/chats |
#chatDirectoryInput | |
sidebarWidth |
290 |
— | |
maxAttachmentChars |
100000 |
#maxAttachmentCharsInput | |
docAgentThreshold |
15000 |
#docAgentThresholdInput | |
executionTimeoutMinutes |
40 |
— | |
contextTokenLimit |
32768 |
#contextTokenLimitInput | |
maxOutputTokens |
null (no override; the provider's default) | #maxOutputTokensInput | |
compactionThresholdPercent |
80 |
#compactionThresholdPercentInput | |
docEditAnimation |
morph |
— |
Precedence¶
How a turn's settings are resolved, as the owners apply them:
- System defaults.
config/system-settings.jsonholdsclientDefaultsfor a profile;sanitizeClientDefaults(server/client-settings.js) drops retired keys from whatever it reads. - The account replaces them.
effectiveClientDefaultsForRequest(server.js) loads the signed-in user's encrypted settings; a non-empty sanitized account object replaces the system defaults, it is not merged with them. Saving from Settings writes the whole client settings object to the account (POST /api/system-settings/client-defaults). - The request lies on top.
runtimeRoutingSettings(server.js) lays the request body's fields over the account's, then pins every credential to the account's value, so a body can change a model or a URL for one turn but never present a key. Chat instructions guide model behavior; they are not another runtime-settings layer. Asking for a different temperature, provider or permission mode does not itself change those settings.
Thinking preferences¶
The Main and Coding thinking controls save the user's toggle, control and effort. Their change handlers update saved preferences directly; capability discovery only changes availability and display. A temporarily unavailable preference is retained across model switches. Send does not wait for the browser's capability check: the server resolves automatic controls from the selected model's capabilities and applies the supported provider fields. The old derived reasoning override and client capability copies are no longer settings inputs.
Sanitizer examples from synthetic fixtures¶
Values below come from named fixtures run through sanitizeClientDefaults and credential-key classification, never from a live profile. These test sanitization only, not account/request resolution or encryption.
| Fixture | Input | After sanitizeClientDefaults |
Fields classified as credentials |
|---|---|---|---|
| A — a new profile | the shipped defaults | unchanged (54 fields, changed: false) |
apiKey, braveApiKey, decisionsApiKey, decisionsLayaApiKey, codingApiKey, classifierApiKey |
| B — a saved account | the defaults with model, apiKey, decisionsActive: "laya", decisionsLayaBaseUrl and the retired plannerModel set |
the retired key is dropped (changed: true); decisionsActive = laya, decisionsLayaBaseUrl = http://127.0.0.1:8080 |
apiKey is classified as a credential; sanitization does not encrypt it |
Retired keys the sanitizer removes: plannerProvider, plannerBaseUrl, plannerApiKey, plannerModel, plannerSettings, maxPlannerPasses, presencePenalty, presencePenaltyModels, codingPresencePenalty, reasoning, reasoningCapabilities, codingReasoningCapabilities.
Not covered here¶
The server section of config/system-settings.json (ports, database, skills, memory); per-chat state such as a chat's own permission mode; the LLM setup cards' saved connections beyond the flat fields they project.