Skip to main content
The clawup.yaml manifest defines your entire deployment — which agents to deploy, where to run them, and how to connect integrations. It’s generated by clawup init and lives at the root of your project directory.

Schema

interface ClawupManifest {
  stackName: string;           // Unique deployment name
  organization?: string;       // Pulumi organization (e.g., "my-org")
  provider: "aws" | "hetzner" | "local"; // Cloud provider
  region: string;              // Deployment region/location
  instanceType: string;        // Default server size
  ownerName: string;           // Your name
  timezone?: string;           // e.g., "America/New_York"
  workingHours?: string;       // e.g., "9am-6pm"
  userNotes?: string;          // Additional context for agents
  modelProvider?: string;      // e.g., "anthropic", "openai", "google", "openrouter"
  defaultModel?: string;       // e.g., "anthropic/claude-opus-4-6"
  templateVars?: Record<string, string>; // Generic template variable values
  secrets?: Record<string, string>;  // ${env:VAR} references
  hooks?: Hooks;                     // Swarm-level lifecycle hooks
  agents: AgentDefinition[];   // Agent configurations
}

Example

stackName: prod
provider: hetzner
region: fsn1
instanceType: cx32
ownerName: Jane Doe
timezone: America/New_York
workingHours: 9am-6pm
modelProvider: anthropic
defaultModel: anthropic/claude-opus-4-6
templateVars:
  LINEAR_TEAM: ENG
  GITHUB_REPO: https://github.com/myorg/myrepo
secrets:
  anthropicApiKey: "${env:ANTHROPIC_API_KEY}"
  tailscaleAuthKey: "${env:TAILSCALE_AUTH_KEY}"
  tailnetDnsName: "${env:TAILNET_DNS_NAME}"
  tailscaleApiKey: "${env:TAILSCALE_API_KEY}"
  hcloudToken: "${env:HCLOUD_TOKEN}"
hooks:
  postProvision: |
    echo "Installing fleet monitoring..."
    curl -sSL https://get.datadoghq.com/agent | sh
agents:
  - name: agent-pm
    displayName: Juno
    role: pm
    identity: ./pm           # Local identity directory
    volumeSize: 30
    plugins:
      openclaw-linear:
        agentId: agent-pm
      slack:
        mode: socket
  - name: agent-eng
    displayName: Titus
    role: eng
    identity: ./eng
    volumeSize: 50
  - name: agent-researcher
    displayName: Atlas
    role: researcher
    identity: "./my-identities/researcher"
    volumeSize: 20
See examples/multi-agent/ for a complete, deployable manifest with three agents (PM, Engineer, Tester), full plugin configuration, and cross-agent ticket workflows.

Fields

Stack Configuration

FieldTypeRequiredDescription
stackNamestringYesUnique name for the Pulumi stack
provider"aws" | "hetzner"YesCloud provider
regionstringYesProvider-specific region/location
instanceTypestringYesDefault server type

Owner Configuration

FieldTypeRequiredDescription
ownerNamestringYesYour name (used in agent USER.md)
timezonestringTimezone for scheduling
workingHoursstringYour availability window
userNotesstringExtra context for agents

Model Configuration

FieldTypeRequiredDescription
modelProviderstringModel provider key (e.g., anthropic, openai, google, openrouter). Set automatically during clawup deploy.
defaultModelstringDefault model for all agents (e.g., anthropic/claude-opus-4-6). Can be overridden per-identity.

Template Variables

FieldTypeRequiredDescription
templateVarsRecord<string, string>Generic template variable values (e.g., LINEAR_TEAM, GITHUB_REPO). Substituted into workspace files at deploy time.

Organization

FieldTypeRequiredDescription
organizationstringPulumi organization name. When set, stack operations use org/stackName.

Secrets

FieldTypeRequiredDescription
secretsobjectGlobal secret references using ${env:VAR_NAME} syntax. Auto-generated by clawup init. See Environment Variables.

Hooks

FieldTypeRequiredDescription
hooksHooksSwarm-level lifecycle hooks that run for all agents during deployment.
Swarm-level hooks run for every agent in the deployment. Four hook types are available:
HookWhenDescription
resolveDuring clawup deployAuto-resolve environment variables via shell scripts
onboardDuring clawup onboardInteractive first-time setup
postProvisionDuring cloud-initServer setup after base provisioning
preStartDuring cloud-initFinal config before gateway starts
hooks:
  resolve:
    SHARED_WEBHOOK_URL: |
      curl -s https://api.example.com/webhook \
        -H "Authorization: Bearer $ADMIN_TOKEN" \
        | jq -r ".url"
  postProvision: |
    echo "Installing fleet monitoring..."
    curl -sSL https://get.datadoghq.com/agent | sh
  preStart: |
    echo "Tagging agent..."
    datadog-agent config set tags "stack:prod"
Swarm hooks execute before identity and plugin hooks. For the full reference, see the Lifecycle Hooks guide.

Agent Configuration

Each entry in the agents array defines a single agent:
FieldTypeRequiredDescription
namestringYesResource name (e.g., agent-pm, agent-researcher)
displayNamestringYesHuman-readable name (e.g., Juno, Atlas)
rolestringYesRole identifier (e.g., pm, eng, researcher)
identitystringYesGit URL or local path to an identity directory. Supports repo#subfolder syntax for mono-repos.
identityVersionstringPin the identity to a specific Git tag or commit hash. Requires identity to be set.
volumeSizenumberYesPersistent storage in GB
instanceTypestringOverride the default server size for this agent
pluginsRecord<string, Record<string, unknown>>Inline plugin configuration (e.g., openclaw-linear: { agentId: agent-pm }). Overrides identity defaults when specified.
secretsobjectPer-agent secret references using ${env:VAR_NAME} syntax. Auto-generated based on plugins, deps, and identity requiredSecrets.
envVarsobjectAdditional environment variables
Every agent must specify an identity — a Git URL or local path to a self-contained identity directory with all workspace files, skills, and configuration. See Identities for details.

Identity vs Manifest

The manifest defines deployment concerns — where agents run, how much storage they get, which stack they belong to. The identity defines agent concerns — personality, skills, model preferences, default plugins and deps. When both the manifest and the identity specify plugins or deps, the manifest values take precedence. This lets you override identity defaults per-deployment.
ConcernDefined In
Cloud provider, region, instance typeManifest
Volume sizeManifest
Personality, skills, heartbeatIdentity (identity.yaml + workspace files)
Model, backup model, coding agentIdentity (identity.yaml)
Plugins, deps (defaults)Identity (identity.yaml)
Plugins, deps (overrides)Manifest (per-agent)
Template variable valuesManifest (owner fields)