> ## Documentation Index
> Fetch the complete documentation index at: https://docs.clawup.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Manifest Reference

> clawup.yaml configuration file reference

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

```typescript theme={null}
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

```yaml theme={null}
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
```

<Tip>
  See [`examples/multi-agent/`](https://github.com/stepandel/clawup/tree/main/examples/multi-agent) for a complete, deployable manifest with three agents (PM, Engineer, Tester), full plugin configuration, and cross-agent ticket workflows.
</Tip>

## Fields

### Stack Configuration

| Field          | Type                   | Required | Description                       |
| -------------- | ---------------------- | -------- | --------------------------------- |
| `stackName`    | string                 | Yes      | Unique name for the Pulumi stack  |
| `provider`     | `"aws"` \| `"hetzner"` | Yes      | Cloud provider                    |
| `region`       | string                 | Yes      | Provider-specific region/location |
| `instanceType` | string                 | Yes      | Default server type               |

### Owner Configuration

| Field          | Type   | Required | Description                       |
| -------------- | ------ | -------- | --------------------------------- |
| `ownerName`    | string | Yes      | Your name (used in agent USER.md) |
| `timezone`     | string |          | Timezone for scheduling           |
| `workingHours` | string |          | Your availability window          |
| `userNotes`    | string |          | Extra context for agents          |

### Model Configuration

| Field           | Type   | Required | Description                                                                                                         |
| --------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------- |
| `modelProvider` | string |          | Model provider key (e.g., `anthropic`, `openai`, `google`, `openrouter`). Set automatically during `clawup deploy`. |
| `defaultModel`  | string |          | Default model for all agents (e.g., `anthropic/claude-opus-4-6`). Can be overridden per-identity.                   |

### Template Variables

| Field          | Type                     | Required | Description                                                                                                             |
| -------------- | ------------------------ | -------- | ----------------------------------------------------------------------------------------------------------------------- |
| `templateVars` | `Record<string, string>` |          | Generic template variable values (e.g., `LINEAR_TEAM`, `GITHUB_REPO`). Substituted into workspace files at deploy time. |

### Organization

| Field          | Type   | Required | Description                                                               |
| -------------- | ------ | -------- | ------------------------------------------------------------------------- |
| `organization` | string |          | Pulumi organization name. When set, stack operations use `org/stackName`. |

### Secrets

| Field     | Type   | Required | Description                                                                                                                                        |
| --------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `secrets` | object |          | Global secret references using `${env:VAR_NAME}` syntax. Auto-generated by `clawup init`. See [Environment Variables](/configuration/environment). |

### Hooks

| Field   | Type    | Required | Description                                                            |
| ------- | ------- | -------- | ---------------------------------------------------------------------- |
| `hooks` | `Hooks` |          | Swarm-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:

| Hook            | When                    | Description                                          |
| --------------- | ----------------------- | ---------------------------------------------------- |
| `resolve`       | During `clawup deploy`  | Auto-resolve environment variables via shell scripts |
| `onboard`       | During `clawup onboard` | Interactive first-time setup                         |
| `postProvision` | During cloud-init       | Server setup after base provisioning                 |
| `preStart`      | During cloud-init       | Final config before gateway starts                   |

```yaml theme={null}
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](/guides/hooks).

### Agent Configuration

Each entry in the `agents` array defines a single agent:

| Field             | Type                                      | Required | Description                                                                                                                        |
| ----------------- | ----------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `name`            | string                                    | Yes      | Resource name (e.g., `agent-pm`, `agent-researcher`)                                                                               |
| `displayName`     | string                                    | Yes      | Human-readable name (e.g., `Juno`, `Atlas`)                                                                                        |
| `role`            | string                                    | Yes      | Role identifier (e.g., `pm`, `eng`, `researcher`)                                                                                  |
| `identity`        | string                                    | Yes      | Git URL or local path to an identity directory. Supports `repo#subfolder` syntax for mono-repos.                                   |
| `identityVersion` | string                                    |          | Pin the identity to a specific Git tag or commit hash. Requires `identity` to be set.                                              |
| `volumeSize`      | number                                    | Yes      | Persistent storage in GB                                                                                                           |
| `instanceType`    | string                                    |          | Override the default server size for this agent                                                                                    |
| `plugins`         | `Record<string, Record<string, unknown>>` |          | Inline plugin configuration (e.g., `openclaw-linear: { agentId: agent-pm }`). Overrides identity defaults when specified.          |
| `secrets`         | object                                    |          | Per-agent secret references using `${env:VAR_NAME}` syntax. Auto-generated based on plugins, deps, and identity `requiredSecrets`. |
| `envVars`         | object                                    |          | Additional environment variables                                                                                                   |

<Note>
  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](/architecture/identities) for details.
</Note>

### 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.

| Concern                               | Defined In                                   |
| ------------------------------------- | -------------------------------------------- |
| Cloud provider, region, instance type | Manifest                                     |
| Volume size                           | Manifest                                     |
| Personality, skills, heartbeat        | Identity (`identity.yaml` + workspace files) |
| Model, backup model, coding agent     | Identity (`identity.yaml`)                   |
| Plugins, deps (defaults)              | Identity (`identity.yaml`)                   |
| Plugins, deps (overrides)             | Manifest (per-agent)                         |
| Template variable values              | Manifest (owner fields)                      |
