ConfigurationSettingsSettings files

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

FileLevelCommit it?
~/.syntic/settings.jsonUser: you, in every projectNo
.syntic/settings.json in the projectProject: everyone on the repositoryYes
.syntic/settings.local.json in the projectLocal: you, in this checkoutNo (add it to .gitignore)
settings.policy.json in an admin folderOrganization: enforced on the machineManaged 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

WayExample
The settings panel/config (or /settings): search with /, change values with ←/→ or Enter.
One key, in a session/config theme=light
From your shellsyntic config set theme light
Edit the fileChanges 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

CommandDoes
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 listPrint 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

FlagEffect
--settings '{"model":"Syntic Code Fast"}'Layer extra settings, inline or from a file. Individual flags such as --model still win.
--setting-sources user,localRead only the listed files (user, project, local, policy).
SYNTIC_SETTING_<KEY>=valueSet 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:

  1. 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).
  2. Is the folder trusted? Project and local files are skipped until you trust the folder (Folder trust).
  3. Is the key allowed at that level? A project file cannot set apiKey, apiBaseUrl, shell, or a permissionMode of auto or bypass. Some keys, such as outputStyle, are read only from your user file.
  4. Does something stronger set it? An environment variable, a flag, or organization policy beats your files. syntic doctor lists policy keys in force.
  5. 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.
  6. Check the value Syntic Code sees: syntic config get <key> (add --project or --local for 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)

PathHolds
settings.jsonYour settings.
SYNTIC.md, rules/Your personal memory.
agents/, skills/, commands/, output-styles/Your custom agents, skills, commands and styles.
themes/Custom themes.
keybindings.jsonYour key bindings.
.mcp.jsonYour MCP servers (user scope).
hooks.json, permissions.jsonHooks 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.jsonFolders you trusted, and your answers about project MCP servers.
cron-jobs.jsonScheduled routines.
update.jsonUpdate channel and update-check switch.
logs/Debug logs.
bin/The syntic binary, when installed with the script.

In a project (<repo>/.syntic)

PathHolds
settings.json, settings.local.jsonProject and local settings.
SYNTIC.mdProject 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.jsonProject MCP servers (project scope).
hooks.json, permissions.jsonHooks 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.