Skip to content

Fleet Configuration

The fleet configuration file (herdctl.yaml) is the root configuration for your entire agent fleet. This document covers every available configuration option.

A minimal configuration requires only the version field:

version: 1

A typical configuration includes workspace settings and agent references:

version: 1
workspace:
root: ~/herdctl-workspace
auto_clone: true
agents:
- path: ./agents/coder.yaml
- path: ./agents/reviewer.yaml
PropertyValue
Typenumber (positive integer)
Default1
RequiredNo

The configuration schema version. Currently only version 1 is supported.

version: 1

PropertyValue
Typeobject
Defaultundefined
RequiredNo

Fleet metadata for identification and documentation purposes.

PropertyValue
Typestring
Defaultundefined
RequiredNo

Human-readable name for the fleet.

PropertyValue
Typestring
Defaultundefined
RequiredNo

Description of the fleet’s purpose.

fleet:
name: production-fleet
description: Production agent fleet for automated code review and deployment

PropertyValue
Typeobject
Defaultundefined
RequiredNo

Default settings applied to all agents in the fleet. Individual agent configurations can override these defaults.

PropertyValue
Typestring
Defaultundefined
RequiredNo

Default Claude model for all agents.

defaults:
model: claude-sonnet-4-20250514
PropertyValue
Typenumber (positive integer)
Defaultundefined
RequiredNo

Default maximum conversation turns per session.

defaults:
max_turns: 50
PropertyValue
Typeenum
Defaultundefined
RequiredNo
Valid Values"default", "acceptEdits", "bypassPermissions", "plan"

Default permission mode for all agents.

  • default - Standard permission prompts
  • acceptEdits - Automatically accept file edits
  • bypassPermissions - Skip all permission checks
  • plan - Planning mode only
defaults:
permission_mode: acceptEdits
PropertyValue
Typeobject
Defaultundefined
RequiredNo

Default Docker settings. See docker for field details.

defaults:
docker:
enabled: true
base_image: node:20-alpine
PropertyValue
Typestring[]
Defaultundefined
RequiredNo

List of tools the agent is allowed to use. Use Bash() patterns to allow specific bash commands.

defaults:
allowed_tools:
- Read
- Write
- Edit
- "Bash(npm *)"
- "Bash(git *)"
- "Bash(pnpm *)"
PropertyValue
Typestring[]
Defaultundefined
RequiredNo

List of tools the agent is not allowed to use. Use Bash() patterns to deny specific bash commands or patterns.

defaults:
denied_tools:
- WebFetch
- "Bash(rm -rf *)"
- "Bash(sudo *)"
PropertyValue
Typeobject
Defaultundefined
RequiredNo

Default work source configuration for agents.

PropertyValue
Typeenum
DefaultN/A
RequiredYes (if work_source is specified)
Valid Values"github"
PropertyValue
Typeobject
Defaultundefined
RequiredNo

GitHub label configuration for work items.

  • ready (string) - Label indicating an issue is ready for processing
  • in_progress (string) - Label applied when work begins
PropertyValue
Typeboolean
Defaultundefined
RequiredNo

Whether to clean up in-progress items on startup.

defaults:
work_source:
type: github
labels:
ready: ready-for-dev
in_progress: in-progress
cleanup_in_progress: true
PropertyValue
Typeobject
Defaultundefined
RequiredNo

Default instance concurrency settings.

PropertyValue
Typenumber (positive integer)
Default1
RequiredNo

Maximum number of concurrent agent instances.

defaults:
instances:
max_concurrent: 3
PropertyValue
Typeobject
Defaultundefined
RequiredNo

Default session configuration.

  • max_turns (number, positive integer) - Maximum conversation turns
  • timeout (string) - Session timeout duration (e.g., "30m", "1h")
  • model (string) - Claude model for the session
defaults:
session:
max_turns: 100
timeout: 1h
model: claude-sonnet-4-20250514

PropertyValue
Typeobject
Defaultundefined
RequiredNo

Global workspace configuration for repository management.

PropertyValue
Typestring
DefaultN/A
RequiredYes (if workspace is specified)

Root directory for all agent workspaces. Supports ~ for home directory expansion.

PropertyValue
Typeboolean
Defaulttrue
RequiredNo

Automatically clone repositories when needed.

PropertyValue
Typenumber (positive integer)
Default1
RequiredNo

Git shallow clone depth. Use 1 for shallow clones (faster), or a higher number for more history.

PropertyValue
Typestring
Default"main"
RequiredNo

Default branch to checkout when cloning repositories.

workspace:
root: ~/herdctl-workspace
auto_clone: true
clone_depth: 1
default_branch: main

PropertyValue
Typearray of fleet references
Default[]
RequiredNo

List of sub-fleet configuration file references. Fleet composition allows you to build “super-fleets” from multiple project fleets, each with their own agents.

FieldTypeRequiredDescription
pathstringYesPath to sub-fleet config file (relative or absolute)
namestringNoOverride the sub-fleet’s name (for qualified name computation)
overridesobjectNoFleet-level configuration overrides
version: 1
fleet:
name: all-projects
web:
enabled: true
port: 3232
fleets:
- path: ./herdctl/herdctl.yaml
- path: ./bragdoc/herdctl.yaml
name: bragdoc # Override sub-fleet's name
- path: ./other-project/herdctl.yaml
overrides:
defaults:
model: claude-opus-4-20250514
agents: # Direct agents still supported
- path: ./global-agents/monitor.yaml

When composing fleets, agents receive a qualified name that includes their fleet hierarchy:

Fleet PathAgent NameQualified Name
["herdctl"]security-auditorherdctl.security-auditor
["bragdoc"]developerbragdoc.developer
["project", "frontend"]designerproject.frontend.designer
[] (root)monitormonitor

The root fleet’s name is not included in qualified names. Agents directly on the root fleet have a qualified name equal to their local name, so single-fleet setups are unaffected.

Use qualified names with CLI commands:

Terminal window
# Trigger a sub-fleet agent
herdctl trigger herdctl.security-auditor
# Check status
herdctl status bragdoc.developer

Sub-fleet names are resolved in this priority order:

  1. Parent’s explicit name — the name field on the fleet reference (highest priority)
  2. Sub-fleet’s own fleet.name — from the sub-fleet’s configuration
  3. Directory name — derived from the config file path (e.g., ./herdctl/herdctl.yaml yields herdctl)

Fleet names must match the pattern ^[a-zA-Z0-9][a-zA-Z0-9_-]*$ (no dots allowed, since dots are the hierarchy separator).

When composing fleets, defaults merge across levels with this priority (lowest to highest):

  1. Super-fleet defaults (gap-filler)
  2. Sub-fleet defaults
  3. Agent’s own config
  4. Per-agent overrides from the sub-fleet’s agents entry
  5. Per-fleet overrides from the super-fleet’s fleets entry (highest priority)
# Super-fleet sets a default model
defaults:
model: claude-sonnet-4-20250514
fleets:
- path: ./project/herdctl.yaml
overrides:
defaults:
model: claude-opus-4-20250514 # Forces all agents in this sub-fleet to use Opus

Only the root fleet’s web configuration is honored. Sub-fleet web configurations are automatically suppressed to ensure a single dashboard serves all agents. This is handled automatically during fleet loading.

The config loader detects cycles in fleet references. If fleet A references fleet B which references fleet A, loading fails with a clear error message showing the cycle chain.

version: 1
fleet:
name: engineering
description: All engineering project agents
web:
enabled: true
port: 3232
defaults:
model: claude-sonnet-4-20250514
permission_mode: acceptEdits
fleets:
- path: ~/projects/herdctl/herdctl.yaml
name: herdctl
- path: ~/projects/bragdoc/herdctl.yaml
name: bragdoc
- path: ~/projects/webapp/herdctl.yaml
name: webapp
agents:
- path: ./agents/overseer.yaml # Fleet-wide monitoring agent

This creates a unified fleet where:

  • All agents are visible in one web dashboard
  • Agents are grouped by project in the sidebar (herdctl, bragdoc, webapp)
  • Each project’s agents retain their own defaults and configurations
  • The overseer agent monitors the entire fleet

PropertyValue
Typearray of agent references
Default[]
RequiredNo

List of agent configuration file references.

FieldTypeRequiredDescription
pathstringYesPath to agent config file (relative or absolute)
overridesobjectNoPer-agent configuration overrides
agents:
- path: ./agents/coder.yaml
- path: ./agents/reviewer.yaml
- path: /etc/herdctl/agents/shared-agent.yaml

Use overrides to customize specific agents without modifying their config files. Overrides are deep-merged with the agent config after fleet defaults are applied.

agents:
- path: ./agents/standard-agent.yaml
# No overrides - uses fleet defaults
- path: ./agents/trusted-agent.yaml
overrides:
docker:
network: host # Grant host network access
env:
SPECIAL_TOKEN: "${SPECIAL_TOKEN}"
- path: ./agents/high-resource-agent.yaml
overrides:
session:
max_turns: 200
docker:
memory: "8g"

Common override use cases:

  1. Grant dangerous Docker options to specific agents:

    overrides:
    docker:
    network: host
    volumes:
    - "/data:/data:ro"
    env:
    GITHUB_TOKEN: "${GITHUB_TOKEN}"
  2. Override session settings:

    overrides:
    session:
    max_turns: 500
    timeout: 8h
  3. Override model:

    overrides:
    model: claude-opus-4-20250514


PropertyValue
Typeobject
Defaultundefined
RequiredNo

Web dashboard configuration. When enabled, herdctl serves a browser-based dashboard for real-time fleet monitoring, agent chat, and job/schedule management. See Web Dashboard for full documentation.

PropertyValue
Typeboolean
Defaultfalse
RequiredNo

Enable the web dashboard server.

PropertyValue
Typenumber (positive integer)
Default3232
RequiredNo

Port for the web dashboard to listen on.

PropertyValue
Typestring
Default"localhost"
RequiredNo

Host to bind the web dashboard to.

PropertyValue
Typenumber (positive integer)
Default24
RequiredNo

Hours before web chat sessions expire.

PropertyValue
Typeboolean
Defaultfalse
RequiredNo

Automatically open the dashboard in the default browser when the fleet starts with herdctl start --web.

fleet:
web:
enabled: true
port: 3232
host: "localhost"
session_expiry_hours: 24
open_browser: false

PropertyValue
Typeobject
Defaultundefined
RequiredNo

Webhook server configuration for receiving external triggers.

PropertyValue
Typeboolean
Defaultfalse
RequiredNo

Enable the webhook server.

PropertyValue
Typenumber (positive integer)
Default8081
RequiredNo

Port for the webhook server to listen on.

PropertyValue
Typestring
Defaultundefined
RequiredNo

Name of the environment variable containing the webhook secret for request validation.

webhooks:
enabled: true
port: 8081
secret_env: WEBHOOK_SECRET

PropertyValue
Typeobject
Defaultundefined
RequiredNo

Global Docker runtime configuration. Fleet config has access to all Docker options, including dangerous ones restricted from agent config.

Safe Options (also available in agent config)

Section titled “Safe Options (also available in agent config)”
FieldTypeDefaultDescription
enabledbooleanfalseEnable Docker execution
ephemeralbooleantrueFresh container per job
memorystring2gMemory limit
cpu_sharesintegerCPU relative weight
cpu_periodintegerCPU CFS period
cpu_quotaintegerCPU CFS quota
max_containersinteger5Container pool limit
workspace_modestringrwWorkspace mount mode
tmpfsstring[]Tmpfs mounts
pids_limitintegerMax processes
labelsobjectContainer labels
FieldTypeDefaultDescription
imagestringherdctl/runtime:latestDocker image
networkstringbridgeNetwork mode: none, bridge, host
userstringHost UID:GIDContainer user
volumesstring[][]Additional volume mounts
portsstring[]Port bindings
envobjectEnvironment variables
host_configobjectRaw dockerode HostConfig passthrough
defaults:
docker:
enabled: true
image: "herdctl/runtime:latest"
network: bridge
memory: "2g"
env:
GITHUB_TOKEN: "${GITHUB_TOKEN}"
volumes:
- "/data/models:/models:ro"

For dockerode options not in our schema:

defaults:
docker:
enabled: true
host_config:
ShmSize: 67108864 # 64MB shared memory
Privileged: true # Use with extreme caution!

Values in host_config override translated options. See dockerode HostConfig for available options.


Here’s a comprehensive example demonstrating all configuration options:

version: 1
fleet:
name: production-fleet
description: Production agent fleet for automated development workflows
defaults:
model: claude-sonnet-4-20250514
max_turns: 50
permission_mode: acceptEdits
allowed_tools:
- Read
- Write
- Edit
- Glob
- Grep
- "Bash(npm *)"
- "Bash(pnpm *)"
- "Bash(git *)"
- "Bash(node *)"
denied_tools:
- "Bash(rm -rf *)"
- "Bash(sudo *)"
docker:
enabled: true
network: bridge # Fleet-level: set network for all agents
env: # Fleet-level: pass credentials to all agents
GITHUB_TOKEN: "${GITHUB_TOKEN}"
work_source:
type: github
labels:
ready: ready-for-dev
in_progress: in-progress
cleanup_in_progress: true
instances:
max_concurrent: 2
session:
max_turns: 100
timeout: 1h
workspace:
root: ~/herdctl-workspace
auto_clone: true
clone_depth: 1
default_branch: main
agents:
- path: ./agents/coder.yaml
# Uses fleet defaults
- path: ./agents/reviewer.yaml
# Uses fleet defaults
- path: ./agents/homelab.yaml
overrides:
docker:
network: host # This agent needs host network for SSH
env:
SSH_AUTH_SOCK: "${SSH_AUTH_SOCK}"
# Note: Chat (Discord/Slack) is configured per-agent, not here.
# See agent config files for chat integration settings.
webhooks:
enabled: true
port: 8081
secret_env: GITHUB_WEBHOOK_SECRET

Validate your configuration with:

Terminal window
herdctl config validate