Settings files
Syntic Code reads its settings from JSON files at a few levels, so you can keep personal preferences, team rules and machine-specific tweaks apart. Every key is listed in the settings reference.
Where settings live
| File | Level | Commit it? |
|---|---|---|
~/.syntic/settings.json | User: you, in every project | No |
.syntic/settings.json in the project | Project: everyone on the repository | Yes |
.syntic/settings.local.json in the project | Local: you, in this checkout | No (add it to .gitignore) |
settings.policy.json in an admin folder | Organization: enforced on the machine | Managed by IT |
The project folder is the nearest .syntic/ above where you start. The user folder can be moved with SYNTIC_CONFIG_DIR.
Which value wins
Later sources override earlier ones:
user → project → local → environment variables (SYNTIC_SETTING_*) → organization policy → command-line flags
A flag can pick a value for one run, but it cannot get around what policy forbids: policy deny rules, disabled modes and allow lists still apply.
Lists of permission rules and hooks are combined across files rather than replaced. A few things can never come from a project’s files, so a repository cannot take over your account: the credential, the API address, the shell, and modes that skip permission prompts. And until you trust a folder, its project and local files are not read at all.
Change settings
| Way | Example |
|---|---|
| The settings panel | /config (or /settings): search with /, change values with ←/→ or Enter. |
| One key, in a session | /config theme=light |
| From your shell | syntic config set theme light |
| Edit the file | Changes are picked up within a second or so, even mid-session. |
| Commands that save their own keys | /model, /theme, /permissions, /hooks, /output-style, /tui and others. |
syntic config
| Command | Does |
|---|---|
syntic config get <key> | Print one value as JSON (exits non-zero if unset). |
syntic config set <key> <value> | Set a value. JSON is understood (true, 12, ["a"]); anything else is stored as text. |
syntic config add <key> <values…> | Append to a list setting, skipping duplicates. |
syntic config remove <key> [values…] | Delete a key, or just some values from a list. |
syntic config list | Print the whole file. |
Add --project for .syntic/settings.json or --local for .syntic/settings.local.json; the default (--global) is your user file.
For one run
| Flag | Effect |
|---|---|
--settings '{"model":"Syntic Code Fast"}' | Layer extra settings, inline or from a file. Individual flags such as --model still win. |
--setting-sources user,local | Read only the listed files (user, project, local, policy). |
SYNTIC_SETTING_<KEY>=value | Set any key from the environment: SYNTIC_SETTING_AUTO_COMPACT_THRESHOLD=0.7 sets autoCompactThreshold. |
A starter file
A project .syntic/settings.json a team might commit:
{
"model": "Syntic Code",
"permissions": {
"allow": ["Bash(pnpm test:*)", "Bash(pnpm lint:*)", "Bash(git status)", "Bash(git diff:*)"],
"ask": ["Bash(git push:*)"],
"deny": ["Read(.env)", "Read(*.pem)"]
},
"env": { "NODE_ENV": "development" },
"hooks": {
"PostToolUse": [
{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "pnpm prettier --write ." }] }
]
},
"worktree": { "baseRef": "fresh" }
}And a personal ~/.syntic/settings.json:
{
"theme": "auto",
"vimMode": true,
"statusLine": { "command": "~/.syntic/statusline.sh" },
"notificationsEnabled": true,
"promptCacheTtl": "1h",
"outputStyle": "Concise"
}outputStyle belongs in your user file: the active style is read from user settings, policy or the environment, not from a project file. More complete files for different situations are on Example settings.
Bad values
A file that is not valid JSON is skipped and reported. A key with the wrong type is dropped and reported at start, in the session and by syntic doctor; the rest of the file still applies. A broken organization policy file stops Syntic Code from starting and names the file.
When a setting does not apply
Work through these in order:
- Is the file valid? Run
syntic doctor. It reports files that are not valid JSON, keys with the wrong type, and unknown keys (with a “did you mean” hint for near misses). - Is the folder trusted? Project and local files are skipped until you trust the folder (Folder trust).
- Is the key allowed at that level? A project file cannot set
apiKey,apiBaseUrl,shell, or apermissionModeofautoorbypass. Some keys, such asoutputStyle, are read only from your user file. - Does something stronger set it? An environment variable, a flag, or organization policy beats your files.
syntic doctorlists policy keys in force. - Is it a list? Rule and hook lists add up across files instead of replacing each other, so a rule you removed in one file may still come from another.
- Check the value Syntic Code sees:
syntic config get <key>(add--projector--localfor those files).
Old key names are migrated rather than dropped: allowedTools becomes alwaysAllow, deniedTools becomes alwaysDeny, maxThinking becomes maxThinkingTokens, and compactThreshold becomes autoCompactThreshold. A notice tells you to rename them.
The .syntic folders
In your home folder (~/.syntic)
| Path | Holds |
|---|---|
settings.json | Your settings. |
SYNTIC.md, rules/ | Your personal memory. |
agents/, skills/, commands/, output-styles/ | Your custom agents, skills, commands and styles. |
themes/ | Custom themes. |
keybindings.json | Your key bindings. |
.mcp.json | Your MCP servers (user scope). |
hooks.json, permissions.json | Hooks and permission rules kept apart from settings, if you prefer. |
plugins/, mods/ | Installed plugins and mods. |
plans/ | Saved plans. |
file-history/ | Backups used by rewind. |
trusted_folders, mcp_approvals.json | Folders you trusted, and your answers about project MCP servers. |
cron-jobs.json | Scheduled routines. |
update.json | Update channel and update-check switch. |
logs/ | Debug logs. |
bin/ | The syntic binary, when installed with the script. |
In a project (<repo>/.syntic)
| Path | Holds |
|---|---|
settings.json, settings.local.json | Project and local settings. |
SYNTIC.md | Project memory (a SYNTIC.md at the repository root works too). |
rules/ | Rules files, optionally scoped with paths. |
agents/, skills/, commands/, output-styles/ | Shared custom agents, skills, commands and styles. |
.mcp.json | Project MCP servers (project scope). |
hooks.json, permissions.json | Hooks and rules kept apart from settings. |
worktrees/ | Worktrees made with --worktree (keep out of git). |
Session transcripts are not stored here; they live in your system’s application data folder (Sessions).
Organization-wide settings, and which keys only an administrator can set, are covered on Organization policy.