Example settings
Complete settings files you can copy and adapt. Each one is a starting point for a common situation. Every key is described in the settings reference, and where each file goes is on Settings files.
Settings files are plain JSON: no comments and no trailing commas. Run syntic doctor after editing to catch typos and keys with the wrong type.
Your own settings
A personal ~/.syntic/settings.json that applies in every project. It keeps your preferences, and guards a few things you never want read.
{
"theme": "auto",
"outputStyle": "Concise",
"effortLevel": "high",
"vimMode": false,
"timeFormat": "24h",
"notificationsEnabled": true,
"showTurnDuration": true,
"statusLine": { "command": "~/.syntic/statusline.sh" },
"permissions": {
"deny": [
"Read(~/.ssh/**)",
"Read(~/.kube/**)",
"Read(**/.env)",
"WebFetch(domain:pastebin.com)"
]
},
"attribution": {
"commit": "Co-written with Syntic Code",
"pr": ""
}
}What this does:
theme: autofollows your terminal’s light or dark background.outputStyleandeffortLevelset how replies read and how hard the model thinks by default.- The deny rules keep credentials and secrets out of reach in every project.
attributionadds a short line to commits and leaves pull request descriptions alone (empty text drops that one).
A team project
A .syntic/settings.json committed to a repository, so everyone gets the same rules. Pair it with a SYNTIC.md for project knowledge.
{
"permissions": {
"allow": [
"Bash(pnpm test:*)",
"Bash(pnpm lint:*)",
"Bash(pnpm typecheck)",
"Bash(git status)",
"Bash(git diff:*)",
"Bash(git log:*)"
],
"ask": [
"Bash(git push:*)",
"Bash(pnpm add:*)",
"Edit(/infra/**)"
],
"deny": [
"Read(.env)",
"Read(.env.*)",
"Read(*.pem)",
"Edit(/migrations/**)"
]
},
"env": {
"NODE_ENV": "development"
},
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{ "type": "command", "command": "pnpm prettier --write ." }]
}
]
},
"worktree": { "baseRef": "fresh" },
"plansDirectory": "docs/plans"
}Notes:
- Allow rules cover the safe, everyday commands so nobody is asked about them.
- Ask rules slow down anything that leaves the machine or changes infrastructure.
envapplies only once each person trusts the folder.- The formatting hook runs after every edit. See Hooks.
plansDirectorykeeps saved plans in the repository. A project may only choose a folder inside itself.
Personal tweaks for this repository go in .syntic/settings.local.json, which should be in .gitignore:
{
"permissions": {
"allow": ["Bash(docker compose up:*)"]
}
}Careful work on code you do not fully trust
A user file for reviewing an unfamiliar repository: edits need approval, shell commands run in the operating system sandbox, and the network is limited to a few hosts.
{
"permissionMode": "default",
"permissions": {
"blockReadsOutsideWorkingDirectories": true,
"disableBypassPermissionsMode": "disable"
},
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"strictCwd": true,
"network": {
"allowedDomains": ["github.com", "registry.npmjs.org"]
},
"filesystem": {
"denyRead": ["~/Documents/**"]
}
},
"disableSkillShellExecution": true
}See Shell sandbox and Permission modes.
Scripts and CI
For automated runs, most choices are passed as flags, but a settings file passed with --settings keeps them in one place:
{
"permissionMode": "dontAsk",
"permissions": {
"allow": ["Read", "Grep", "Glob", "Bash(cargo test:*)", "Bash(cargo clippy:*)"]
},
"maxTurns": 30,
"autoCompact": true,
"verification": false,
"agents": { "defaultMaxBudgetUsd": 2 }
}syntic -p "fix the failing test in src/parser" --settings ci-settings.jsondontAskrefuses anything not on the allow list instead of waiting for an answer.maxTurnsand the sub-agent budget cap how far a run can go.verification: falseskips the after-turn check to keep runs short.
More on Headless runs.
An organization policy
A managed settings.policy.json that an administrator deploys to every machine. It pins the model choices, blocks risky modes, and limits MCP servers and plugin sources.
{
"model": "Syntic Code",
"availableModels": ["Syntic Code", "Syntic Code Fast"],
"maxEffortLevel": "high",
"permissions": {
"deny": ["Read(**/.env)", "Read(**/*.pem)", "WebFetch(domain:pastebin.com)"],
"disableBypassPermissionsMode": "disable"
},
"allowManagedHooksOnly": true,
"allowedMcpServers": [
{ "serverName": "github" },
{ "serverUrl": "https://mcp.example.com/*" }
],
"strictKnownMarketplaces": [{ "hostPattern": "^git\\.example\\.com$" }],
"sandbox": {
"network": { "deniedDomains": ["paste.example"] }
},
"minimumVersion": "0.1.0",
"companyAnnouncements": ["Reminder: keep customer data out of prompts."]
}Where to put this file on each system, and the keys only policy can set, are on Managed settings.
Interface tweaks
A user file focused on the screen:
{
"theme": "dark-daltonized",
"renderer": "fullscreen",
"scrollSpeed": 2,
"wheelAcceleration": true,
"maxProseWidth": 100,
"prefersReducedMotion": true,
"spinnerTipsEnabled": false,
"vimMode": true,
"vimInsertModeRemaps": { "jj": "<Esc>" }
}See Themes, Full-screen mode and Accessibility.