Tack
Reference

Configuration Reference

Full reference for .tack/config.yaml options.

Config Model

Tack merges config from three sources. Later layers override earlier ones:

  1. Built-in defaults — embedded in the binary
  2. User config~/.config/tack/config.yaml
  3. Project config<repo>/.tack/config.yaml

The daemon reads the user layer on startup. Project-scoped CLI commands read the merged result.

tack config list              # Show all merged values
tack config get models.default # Show a specific value

Complete Example

This example shows one possible Pi runtime with local sandboxes.

daemon:
  listen: "127.0.0.1:9800"
  external_url: ""
  data_dir: "~/.config/tack/data"
  base_branch: "main"

sandbox:
  provider: "local"
  worktree_dir: ""

project_setup:
  commands:
    - "bun install"
  verify:
    - "bun --version"

agents:
  runtime: "pi"
  max_concurrent: 8
  max_depth: 2
  stagger_delay_ms: 500
  idle_timeout_minutes: 15
  pi:
    provider: "openai-codex"
    model: ""
    thinking_level: "medium"
    extension_path: ""
  timeouts:
    default:
      max_duration_minutes: 30
      idle_minutes: 10
    planner:
      max_duration_minutes: 20
    builder:
      max_duration_minutes: 45
    reviewer:
      max_duration_minutes: 15

runtime_auth:
  mode: tack
  runtime: pi
  provider: openai-codex
  method: oauth
  credential_ref: openai-codex

models:
  default: gpt-5.4
  agent: gpt-5.4
  planner: gpt-5.4
  small_tasks: gpt-5.4-mini
  deterministic: gpt-5.4-mini

planning:
  default_mode: collaborative
  model: ""

watchdog:
  check_interval_seconds: 30
  nudge_after_minutes: 10
  escalate_after_nudges: 3

tools:
  max_per_agent: 20
  always_include: []
  always_exclude: []

git:
  author_name: Tack
  author_email: tack@local

quality_gates:
  - "bun test"
  - "bunx tsc --noEmit"
  - "bun run lint"

Field Reference

daemon

FieldTypeDefaultDescription
listenstring"127.0.0.1:9800"HTTP bind address for the daemon API and SSE events
external_urlstring""Public URL for remote sandbox callbacks. Required when using Daytona sandboxes.
data_dirstring"~/.config/tack/data"Machine-wide runtime state directory. Stores SQLite databases and activity logs.
base_branchstring"main"Git branch used as the base for worktrees and merge target

sandbox

FieldTypeDefaultDescription
providerstring"local"Sandbox provider: local (git worktrees) or daytona (remote VMs)
worktree_dirstring""Override the directory where local worktrees are created. Empty uses the default location inside the repo.
default_resources.cpuint2CPU cores allocated per Daytona sandbox
default_resources.memoryint2048Memory in MB allocated per Daytona sandbox
default_resources.diskint10Disk in GB allocated per Daytona sandbox
auto_stop_intervalint30Minutes before idle Daytona sandboxes are auto-stopped
auto_delete_intervalint1440Minutes before stopped Daytona sandboxes are auto-deleted
daytona.api_urlstring""Daytona API URL. If empty, uses the default Daytona endpoint.
daytona.snapshotstring""Daytona snapshot ID. Pre-built VM images with dependencies for faster startup.

sandbox.post_create exists as a deprecated compatibility input. Use project_setup.commands instead.

project_setup

FieldTypeDefaultDescription
commandsstring[][]Shell commands to run after sandbox creation (e.g., "bun install")
verifystring[][]Lightweight checks to confirm setup succeeded (e.g., "bun --version")

agents

FieldTypeDefaultDescription
runtimestring"pi"Agent runtime. Supported values include pi and claude-code. See Agent Runtimes.
max_concurrentint8Maximum number of agent sessions running at the same time
max_depthint2Maximum nesting depth for blueprint references
stagger_delay_msint500Milliseconds to wait between spawning concurrent agents
idle_timeout_minutesint15Coarse idle timeout. Overridden by per-role timeouts if set.
pi.providerstring"anthropic"LLM provider for the Pi runtime.
pi.modelstring""Model override for Pi. If empty, uses models.default.
pi.thinking_levelstring"medium"Pi thinking level: controls how much reasoning the model does
pi.extension_pathstring""Path to custom Pi extension directory. If empty, uses the embedded extension.

agents.timeouts

Per-role timeout configuration. Each role can have max_duration_minutes (total wall clock) and idle_minutes (time since last output). The top-level idle_timeout_minutes is the coarse default; per-role idle_minutes overrides it when set.

RoleDefault max_duration_minutesDefault idle_minutes
default3010
planner20— (inherits default)
builder45— (inherits default)
reviewer15— (inherits default)

runtime_auth

Controls how credentials get from Tack's credential store into the running agent.

FieldTypeDefaultDescription
modestring"tack"tack (Tack manages and injects credentials) or native (runtime uses its own auth)
runtimestringRuntime name this auth config applies to
providerstringLLM provider this auth config applies to
methodstring"api_key"Authentication method: api_key or oauth
credential_refstringKey in the credentials store to read from. Required when mode: tack.

models

Model selection split by purpose. Each field accepts a model identifier string.

FieldDescription
defaultFallback for any role not explicitly set
agentBuilder and reviewer agents
plannerPlanner agent
small_tasksLightweight operations where a smaller model suffices
deterministicDeterministic step operations

planning

FieldTypeDefaultDescription
default_modestring"collaborative"Planning mode. Currently only collaborative is supported.
modelstring""Shared planning model override. If empty, uses models.planner.

watchdog

Monitors agent health and triggers escalation when agents stall.

FieldTypeDefaultDescription
check_interval_secondsint30How often the watchdog checks agent status
nudge_after_minutesint10Minutes of inactivity before sending a nudge to the agent
escalate_after_nudgesint3Number of nudges before escalating to human

tools

Controls agent tool access globally. Also configurable per-blueprint-step and per-rule.

FieldTypeDefaultDescription
max_per_agentint20Maximum number of tools available to each agent
always_includestring[][]Tools that are always available regardless of other restrictions
always_excludestring[][]Tools that are always removed from agent tool sets

git

FieldTypeDefaultDescription
author_namestring"Tack"Author name for commits made by agents
author_emailstring"tack@local"Author email for commits made by agents

quality_gates

List of shell commands. Each command runs in the sandbox. Non-zero exit means failure. Examples:

JavaScript/TypeScript:

quality_gates:
  - "bun test"
  - "bunx tsc --noEmit"
  - "bun run lint"

Go:

quality_gates:
  - "go vet ./..."
  - "go test ./..."
  - "go build ./..."

Override in .tack/config.yaml when your project needs different validation commands.

Credentials

Stored separately in ~/.config/tack/credentials.yaml:

providers:
  openai-codex:
    type: oauth
    access_token: "..."
    refresh_token: "..."
    expires_at: 0

git:
  type: pat
  host: github.com
  token: GITHUB_TOKEN

sandbox:
  daytona:
    type: api_key
    api_key: DAYTONA_API_KEY

Credential values can be:

  • Literal secrets — stored directly in the file
  • Environment variable names — Tack reads os.Getenv() for the value
  • Shell command lookups!op read op://vault/item runs the command and uses the output

See the Credentials & Auth guide for full details.

Environment Variables

Common environment variables used by credential references:

VariablePurpose
ANTHROPIC_API_KEYAnthropic API authentication
OPENAI_API_KEYOpenAI API authentication
GITHUB_TOKENGitHub PAT for PR creation and repo access
DAYTONA_API_KEYDaytona sandbox API authentication

On this page