Skip to main content
Clawup uses an identity system to define agent behavior. Each identity is a self-contained directory with an identity.yaml manifest and workspace files — everything an agent needs to operate: personality, skills, model preferences, plugin configuration, and dependencies. For a complete field-by-field reference, see Identity Manifest Reference. For a step-by-step creation guide, see Creating Identities.

Identity Structure

my-identity/
├── identity.yaml       # Manifest: model, plugins, deps, skills, template vars
├── SOUL.md             # Personality, approach, boundaries
├── IDENTITY.md         # Name, role, emoji
├── HEARTBEAT.md        # Periodic tasks
├── TOOLS.md            # Tool reference
├── AGENTS.md           # Operational instructions
├── BOOTSTRAP.md        # First-run setup
├── USER.md             # Owner info (templated)
└── skills/
    └── my-skill/
        └── SKILL.md
Identities can live in a Git repo, a monorepo subdirectory (using repo#subfolder syntax), or a local directory.

identity.yaml Reference

The identity manifest declares the agent’s configuration defaults.

Required Fields

FieldTypeDescription
namestringMachine-readable identifier (e.g., eng, researcher)
displayNamestringHuman-readable name (e.g., Titus, Atlas)
rolestringFunctional role (e.g., pm, eng, tester, researcher)
emojistringGitHub shortcode without colons (e.g., telescope, clipboard)
descriptionstringOne-line summary of what the agent does
volumeSizenumberDefault disk size in GB
skillsstring[]Bundled skill directory names
templateVarsstring[]Template variables used in workspace files

Optional Fields

FieldTypeDescription
modelstringAI model identifier (e.g., anthropic/claude-opus-4-6)
backupModelstringFallback model if primary is unavailable
codingAgentstringCoding agent CLI to install (claude-code, codex, amp, etc.)
instanceTypestringDefault cloud instance type override
depsstring[]System dependencies from the dep registry
pluginsstring[]OpenClaw plugins from the plugin registry
pluginDefaultsobjectPer-plugin default configuration

Full Example

name: eng
displayName: Titus
role: eng
emoji: building_construction
description: Lead engineering, coding, shipping
volumeSize: 50

model: anthropic/claude-opus-4-6
backupModel: anthropic/claude-sonnet-4-5
codingAgent: claude-code

deps:
  - gh
  - brave-search

plugins:
  - openclaw-linear
  - slack

pluginDefaults:
  openclaw-linear:
    stateActions:
      triage: remove
      backlog: add
      started: add
      completed: remove
  slack:
    mode: socket
    dm:
      enabled: true
      policy: open

skills:
  - eng-queue-handler
  - eng-ticket-workflow
  - eng-pr-tester
  - pr-review-resolver

templateVars:
  - OWNER_NAME
  - TIMEZONE
  - WORKING_HOURS
  - USER_NOTES
  - LINEAR_TEAM
  - GITHUB_REPO

Registries

Identity fields like codingAgent, deps, and plugins reference entries from built-in registries. Each registry maps a name to install scripts and configuration.

Coding Agent Registry

The codingAgent field selects which coding CLI is installed and configured on the agent’s cloud instance.
AgentCLIDescription
claude-codeclaudeClaude Code CLI (default)
Each entry provides an install script, model configuration script, and OpenClaw cliBackends config. New coding agents can be added by extending the registry in packages/core/src/coding-agent-registry.ts.

Dep Registry

System-level tools installed on agents. Declared via the deps field.
DepWhat It Installs
ghGitHub CLI (with token-based auth)
brave-searchBrave Search API key (config-only, no binary)
New deps can be added in packages/core/src/dep-registry.ts.

Plugin Registry

OpenClaw plugins configured per-agent. Declared via the plugins field.
PluginWhat It Does
openclaw-linearLinear issue tracking with webhook-driven ticket queuing
slackSlack bot integration (Socket Mode)
Plugin metadata is defined in packages/core/src/plugin-registry.ts. Plugin configuration defaults can be set in pluginDefaults in the identity manifest, and overridden per-deployment in the agent’s plugins field in the manifest.

Workspace Files

Workspace files are injected into ~/.openclaw/workspace/ on the agent’s cloud instance. They define everything about how the agent behaves.

Identity-Specific Files

FileWhat It Does
SOUL.mdCore personality — approach, values, superpowers, boundaries, vibe. This is who the agent is.
IDENTITY.mdName, role label, emoji, avatar. Short identification metadata.
HEARTBEAT.mdPeriodic checklist executed every minute. Handles bootstrap detection and polling-based tasks.
TOOLS.mdTool-specific notes and common commands. Cheat sheet for the agent’s toolchain.

Shared Files

These files follow the same conventions across identities:
FileWhat It Does
USER.mdOwner information — name, timezone, working hours, custom notes. Populated from template variables.
AGENTS.mdOperational instructions — session startup, memory management, safety rules, group chat etiquette.
BOOTSTRAP.mdFirst-run checklist — verifies integrations work, then deletes itself.

Skills

Skills are reusable workflows bundled with an identity. Each skill lives in skills/<skill-name>/SKILL.md.

SKILL.md Format

Every skill file has YAML frontmatter followed by markdown instructions:
---
name: research-report
description: Conduct deep research and produce a structured report
metadata: {"openclaw":{"emoji":":telescope:"}}
---

# Research Report

Step-by-step workflow instructions here...

Frontmatter Fields

FieldRequiredDescription
nameYesSkill identifier
descriptionYesOne-line summary
metadataNoJSON string — openclaw.emoji sets UI icon, openclaw.requires.bins declares binary deps
user-invocableNoWhether users can trigger directly (default: true). Set false for system-triggered skills like queue handlers.

Private vs Public Skills

skills:
  - my-private-skill          # Loaded from skills/my-private-skill/SKILL.md
  - clawhub:org/public-skill  # Fetched from ClawHub registry
  • Private skills — directory name in the skills/ folder, bundled with the identity
  • Public skills — prefixed with clawhub:, fetched from the ClawHub public registry at deploy time

Template Variables

Workspace files support {{VARIABLE}} substitution. Variables declared in templateVars are populated from values collected during clawup init.
VariableDescriptionExample
{{OWNER_NAME}}Agent owner nameJane
{{TIMEZONE}}Owner timezoneAmerica/New_York
{{WORKING_HOURS}}Working hours9am-6pm
{{USER_NOTES}}Custom notesPrefers detailed status updates
{{LINEAR_TEAM}}Linear team identifierENG
{{GITHUB_REPO}}Target repositorymyorg/myrepo
You can define custom variables beyond these — any name listed in templateVars will be prompted during clawup init and substituted at deploy time.

Built-in Identities

Clawup ships with three built-in identities hosted at github.com/stepandel/army-identities:
IdentityAgentRoleVolumeModel
pmJunoProduct Manager — breaks down tickets, coordinates work, communicates via Slack30 GBClaude Opus 4.6
engTitusEngineer — writes code, opens PRs, iterates on review feedback50 GBClaude Opus 4.6
testerScoutQA Tester — reviews PRs, tests changes, files bugs back to Linear30 GBClaude Opus 4.6
These are standard identities in the same format as any custom identity. They serve as both production-ready defaults and reference implementations.

Built-in Skills

SkillUsed ByPurpose
pm-queue-handlerPMProcesses inbound tickets — routes, preps, and assigns
linear-ticket-prepPMMulti-phase ticket preparation — sizing, research, context, prompt generation
linear-ticket-routingPMRoutes tickets by labels to the appropriate workflow
eng-queue-handlerEngineerDelegates to coding agent, monitors execution, ships PRs
eng-ticket-workflowEngineerStructured ticket implementation workflow
eng-pr-testerEngineerPR testing and validation
pr-review-resolverEngineer, QAPR review comment resolution
tester-queue-handlerQAReviews PRs against acceptance criteria, runs tests, reports results

How Agents Coordinate

The built-in identities coordinate asynchronously through Linear and GitHub. Work is driven by the openclaw-linear plugin, which watches for ticket state changes via webhooks and routes tickets into per-agent queues.
Linear Ticket (state change)


openclaw-linear plugin (webhook)

     ├── Backlog/Unstarted → PM's queue
     ├── Backlog/Started   → Engineer's queue
     └── Started           → Tester's queue


Queue handler skill runs automatically

     ├── PM: preps ticket, assigns to Engineer
     ├── Engineer: delegates to Claude Code, opens PR, assigns Tester
     └── Tester: reviews PR, runs tests, reports results

Linear Plugin Queue System

The pluginDefaults for openclaw-linear in each identity define routing rules — which ticket states add or remove tickets from the agent’s queue:
AgentQueue Adds OnQueue Removes On
PMBacklog, UnstartedTriage, Started, Completed, Cancelled
EngineerBacklog, StartedTriage, Completed, Cancelled
TesterStartedTriage, Completed, Cancelled
When a ticket enters an agent’s queue, the plugin triggers that agent’s queue handler skill automatically.

Heartbeat

The heartbeat fires every minute and executes the agent’s HEARTBEAT.md checklist. For most agents this is minimal — just a bootstrap check. The primary work trigger is the Linear plugin queue. The tester identity has a more active heartbeat that also handles PR review comment resolution (scanning open PRs for unresolved comments and applying fixes).

Using Identities

Git Repository

agents:
  - name: agent-researcher
    displayName: Atlas
    role: researcher
    identity: "https://github.com/your-org/your-identities#researcher"
    identityVersion: "v1.0.0"    # optional: pin to tag or commit
    volumeSize: 20

Local Directory

agents:
  - name: agent-researcher
    displayName: Atlas
    role: researcher
    identity: "./my-identities/researcher"
    volumeSize: 20

Monorepo Layout

Multiple identities can share a single Git repo, each in a subdirectory:
my-identities/
├── researcher/
│   ├── identity.yaml
│   └── ...
├── analyst/
│   ├── identity.yaml
│   └── ...
└── writer/
    ├── identity.yaml
    └── ...
Reference each with https://github.com/org/my-identities#researcher, #analyst, etc. Identities are cached locally at ~/.clawup/identity-cache/ and re-fetched on each deploy.

Customization

Override Plugins and Deps

The manifest can override an identity’s default plugins and deps per-agent:
agents:
  - name: agent-eng
    displayName: Titus
    role: eng
    identity: "https://github.com/stepandel/army-identities#eng"
    volumeSize: 50
    plugins:
      - slack              # Only Slack, skip Linear
    deps:
      - gh                 # Only GitHub CLI, skip Brave Search

Override Volume and Instance Type

agents:
  - name: agent-eng
    displayName: Titus
    role: eng
    identity: "https://github.com/stepandel/army-identities#eng"
    volumeSize: 100              # More space for large repos
    instanceType: t3.large       # More compute

Create a New Identity

To create an agent with a completely custom role, create a new identity directory. See the example identity for a minimal starting point, or the Creating Identities guide for a full walkthrough.
Start by copying the example identity and modifying it for your use case. The key files to customize are SOUL.md (personality), HEARTBEAT.md (periodic tasks), and any skills you want to bundle.