ConfigurationSettingsExample settings

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: auto follows your terminal’s light or dark background.
  • outputStyle and effortLevel set how replies read and how hard the model thinks by default.
  • The deny rules keep credentials and secrets out of reach in every project.
  • attribution adds 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.
  • env applies only once each person trusts the folder.
  • The formatting hook runs after every edit. See Hooks.
  • plansDirectory keeps 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.json
  • dontAsk refuses anything not on the allow list instead of waiting for an answer.
  • maxTurns and the sub-agent budget cap how far a run can go.
  • verification: false skips 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.