Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Configuration Reference

Complete reference for ennio.yaml. All fields listed with types, defaults, and descriptions.

Top-Level Fields

FieldTypeDefaultDescription
portu163000Web API listen port
terminal_portu163001Terminal WebSocket port
direct_terminal_portu16?Direct terminal access port
ready_thresholdDuration2sTime before a session is considered ready (milliseconds in YAML)
defaultsDefaultPluginssee belowGlobal plugin defaults
projects[ProjectConfig][]List of project configurations
notifiers[NotifierConfig][]Notification channel definitions
notification_routingMap<String, [String]>{}Route reaction types to specific notifiers
reactionsMap<String, ReactionConfig>built-in setGlobal reaction overrides
database_urlString?sqlite:ennio.dbSQLite database URL
nats_urlString?nats://127.0.0.1:4222NATS server URL
api_tokenSecretString?Bearer token for API authentication
cors_origins[String][]Allowed CORS origins

DefaultPlugins

FieldTypeDefaultDescription
runtimeString"tmux"Default runtime plugin
agentString"claude-code"Default agent plugin
workspaceString"worktree"Default workspace plugin
notifiers[String][]Default notifier names

ProjectConfig

FieldTypeDefaultDescription
nameStringrequiredUnique project identifier
project_idProjectId?Explicit project ID (auto-derived from name if omitted)
repoStringrequiredGit repository URL
pathPathBufrequiredAbsolute local path to the repository
default_branchString"main"Default git branch
session_prefixString?Prefix for generated session IDs
runtimeString?Override default runtime
agentString?Override default agent
workspaceString?Override default workspace
tracker_configTrackerConfig?Issue tracker configuration
scm_configScmConfig?Source control configuration
symlinks[SymlinkConfig][]Symlinks to create in workspace
post_create[String][]Shell commands run after workspace creation
agent_configAgentSpecificConfig?Agent-specific settings
reactionsMap<String, ReactionConfig>{}Project-specific reaction overrides
agent_rules[String][]Instructions passed to the agent
max_sessionsu32?Maximum concurrent sessions
ssh_configSshConnectionConfig?Remote execution config (enables SSH mode)

TrackerConfig

FieldTypeDescription
pluginStringPlugin name: "github" or "linear"
configMap<String, Value>Plugin-specific configuration (e.g., owner, repo, token)
tracker_config:
  plugin: github
  config:
    owner: my-org
    repo: my-repo
    token: ${GITHUB_TOKEN}

ScmConfig

FieldTypeDescription
pluginStringPlugin name: "github"
configMap<String, Value>Plugin-specific configuration (e.g., owner, repo, token)
scm_config:
  plugin: github
  config:
    owner: my-org
    repo: my-repo
    token: ${GITHUB_TOKEN}

NotifierConfig

FieldTypeDescription
pluginStringPlugin name: "desktop", "slack", or "webhook"
nameStringUnique notifier identifier (used in routing rules)
configMap<String, Value>Plugin-specific configuration
notifiers:
  - plugin: slack
    name: team-slack
    config:
      webhook_url: ${SLACK_WEBHOOK_URL}

  - plugin: webhook
    name: ops-alerts
    config:
      url: https://hooks.example.com/ennio

  - plugin: desktop
    name: local
    config: {}

ReactionConfig

FieldTypeDefaultDescription
enabledbooltrueWhether this reaction is active
actionReactionAction"notify"send_to_agent, notify, or auto_merge
messageString?Message to send (for send_to_agent)
priorityEventPriority"info"Notification priority level
escalate_afterDuration?Seconds before escalating to notification
thresholdDuration?Time threshold before reaction triggers (e.g., idle detection)
retriesu320Maximum retry attempts
include_summaryboolfalseInclude session summary in notification
reactions:
  ci-failed:
    enabled: true
    action: send_to_agent
    message: "CI failed. Check the logs and fix the issues."
    priority: action
    retries: 3
    escalate_after: 180

AgentSpecificConfig

FieldTypeDescription
permissionsString?Permission mode for the agent (e.g., agent-specific flags)
modelString?Model to use (e.g., "opus", "sonnet")
passthroughMap<String, Value>Additional key-value pairs passed through to the agent
agent_config:
  model: opus
  permissions: "--dangerously-skip-permissions"
  passthrough:
    max_turns: 200

SymlinkConfig

FieldTypeDescription
sourcePathBufSource path (absolute or relative)
targetPathBufTarget path in workspace

SshConnectionConfig

FieldTypeDefaultDescription
hostStringrequiredRemote hostname
portu1622SSH port
usernameStringrequiredSSH username
authSshAuthConfigrequiredAuthentication method
strategySshStrategyConfigtmuxRemote execution strategy
connection_timeoutDuration30sSSH connection timeout (seconds in YAML)
keepalive_intervalDuration?SSH keepalive interval (seconds in YAML)
host_key_policyHostKeyPolicyConfigstrictHost key verification policy
known_hosts_pathPathBuf?Path to known_hosts file
node_configNodeConnectionConfig?Remote node daemon config

SshAuthConfig Variants

Discriminated by the type field.

Key authentication:

auth:
  type: key
  path: ~/.ssh/id_ed25519
  passphrase: ${SSH_PASSPHRASE}  # optional

Agent authentication:

auth:
  type: agent

Password authentication:

auth:
  type: password
  password: ${SSH_PASSWORD}

SshStrategyConfig

ValueDescription
tmuxCreate a tmux session on the remote host (default)
tmateCreate a tmate session for shared terminal access
remote_controlUse agent’s remote control protocol
nodeDeploy and communicate via gRPC ennio-node daemon

HostKeyPolicyConfig

ValueDescription
strictReject unknown or changed host keys (default)
accept_newAccept unknown keys, reject changed keys
accept_allAccept any key (insecure, for testing only)

NodeConnectionConfig

FieldTypeDefaultDescription
portu169100gRPC listen port on remote host
idle_timeoutDuration3600sAuto-shutdown after idle (seconds in YAML)
workspace_rootPathBuf?Root directory for workspaces
ennio_binary_pathPathBuf?Path to ennio-node binary on remote
auth_tokenSecretString?Bearer token for gRPC auth

Full Example

port: 3000
terminal_port: 3001
api_token: ${ENNIO_API_TOKEN}
database_url: sqlite:ennio.db
nats_url: nats://127.0.0.1:4222
cors_origins:
  - http://localhost:3000

defaults:
  runtime: tmux
  agent: claude-code
  workspace: worktree
  notifiers:
    - local

notifiers:
  - plugin: desktop
    name: local
    config: {}
  - plugin: slack
    name: team-slack
    config:
      webhook_url: ${SLACK_WEBHOOK}

notification_routing:
  agent-exited:
    - team-slack
    - local
  all-complete:
    - local

reactions:
  approved-and-green:
    enabled: true
    action: auto_merge

projects:
  - name: backend
    repo: git@github.com:org/backend.git
    path: /home/user/repos/backend
    default_branch: main
    max_sessions: 3
    session_prefix: be
    tracker_config:
      plugin: github
      config:
        owner: org
        repo: backend
        token: ${GITHUB_TOKEN}
    scm_config:
      plugin: github
      config:
        owner: org
        repo: backend
        token: ${GITHUB_TOKEN}
    symlinks:
      - source: ../.env
        target: .env
    post_create:
      - cargo build
    agent_config:
      model: opus
      passthrough:
        max_turns: 200
    agent_rules:
      - "Write tests for all new code"
      - "Use conventional commits"

  - name: remote-ml
    repo: git@github.com:org/ml-pipeline.git
    path: /home/gpu-user/repos/ml-pipeline
    agent: aider
    ssh_config:
      host: gpu-server.internal
      username: gpu-user
      auth:
        type: key
        path: ~/.ssh/id_ed25519
      strategy: node
      host_key_policy: accept_new
      node_config:
        port: 9100
        workspace_root: /home/gpu-user/workspaces
        auth_token: ${NODE_AUTH_TOKEN}