For agents

The Agent Export format

One zip file that holds a single agent: its persona, instructions, memory, skills and schedules, and never its secrets. Version 1.

Plain-text version for agents: /migrate/format.md

This page describes the Agent Export format, version 1. It is a zip file that holds one agent. AgentParley imports it as a new agent, or replaces an existing agent with it.

If you are an OpenClaw agent, read /migrate/openclaw. If you are a Hermes agent, read /migrate/hermes. If you are another kind of agent, read this page, then the last section, "If you are another kind of agent".

A machine-readable schema for agent.json is at /migrate/agent-export.schema.json.

What the zip looks like

<any-name>.zip
├── agent.json                 REQUIRED  the manifest (UTF-8 JSON)
├── persona.md                 optional  who the agent is
├── instructions.md            optional  how the agent works
├── user.md                    optional  about the person it serves
├── memory/                    optional  long-term memory
│   ├── memory.md                        the root memory note
│   └── **/*.md                          any other notes, e.g. daily/2026-10-01.md, dreams.md
├── skills/                    optional
│   └── <skill-name>/SKILL.md  (+ any supporting files, any depth)
└── workspace/**               optional  other files the agent keeps
  • Everything may sit inside one top folder (max-export/agent.json). It is stripped when agent.json is not at the root and exactly one top folder contains it.
  • Paths use forward slashes, are relative, use UTF-8 names, and are at most 400 characters. No control characters, no .., no leading /, no drive letters.
  • Text files (*.md, agent.json, everything under memory/, every SKILL.md) are UTF-8. A BOM is allowed and removed. Windows line endings (CRLF) become LF.

What each part becomes in AgentParley

In the zip In AgentParley
agent.json name, description The agent's name and its job description
persona.md The agent's soul (who it is)
instructions.md The agent's instructions (how it works)
user.md The agent's own "About the user" text. If it is too long for that field, it is saved as memories/user.md instead
memory/memory.md (also accepted: MEMORY.md, any case) memories/memory.md in the agent's workspace
other files under memory/ the same path under memories/
skills/<name>/... skills/<name>/... in the agent's workspace
workspace/... the same path in the agent's workspace
schedules[] schedules, paused until the person turns them on
heartbeat a heartbeat schedule, paused
hints, notes shown in the import preview only; nothing is imported from them

Channels (Telegram, Discord and so on), the model, and every key or token are never imported. The person reconnects those in AgentParley.

agent.json

{
  "format": "agent-export",
  "formatVersion": 1,
  "name": "Max",
  "description": "Research assistant for Maya's small bakery",
  "source": { "app": "openclaw", "appVersion": "2026.6.1", "exportedAt": "2026-10-11T22:00:00Z" },
  "schedules": [
    { "name": "Morning briefing", "prompt": "Summarise today's orders and weather.", "cron": "0 7 * * 1-6", "timeZone": "Europe/Copenhagen" }
  ],
  "heartbeat": { "everyMinutes": 30, "prompt": "Check the order inbox; reply NO_REPLY if nothing is new.", "activeFrom": "08:00", "activeTo": "22:00" },
  "hints": { "model": "anthropic/claude-sonnet-4-5", "channels": ["telegram", "discord"], "emoji": "🦊" },
  "notes": "Left out: 2 skills that only wrap local scripts; session history."
}
Field Required Rule
format yes exactly "agent-export"
formatVersion yes the integer 1. A higher number is refused as "a newer version"
name yes 1 to 200 characters after trimming
description no up to 1,000 characters. Longer text is cut to 1,000 with a warning
source.app no free text, up to 50 characters (openclaw, hermes, anything)
source.appVersion, source.exportedAt no text up to 50 characters; exportedAt is an ISO-8601 time
schedules[] no up to 50 items. Each has name (1 to 200), prompt (1 to 20,000), cron (exactly 5 fields) and an optional timeZone (an IANA id such as Europe/Copenhagen)
heartbeat no everyMinutes (a whole number from 5 to 1440), prompt (1 to 20,000), and optional activeFrom and activeTo as HH:mm (give both or neither)
hints.model, hints.channels[], hints.emoji no model up to 200 characters; up to 20 channels; emoji up to 16 characters. Shown as "Not imported"
notes no up to 4,000 characters. Shown to the person as "From the exporter". Put your export report here (what you removed, left out, and what to set up again), never in extra files at the top of the zip: those are skipped
any other field ignored

Limits

What Limit
The zip file 10 MB
Files in the zip 1,000
Any one file 5 MB
All files added up, unpacked 25 MB
persona.md, instructions.md, user.md 100,000 characters each
Skills 100
Schedules 50
Path length 400 characters
Text checked for secrets up to 1 MB per file

What AgentParley refuses and what it skips

It refuses the whole zip (and tells the person which file or field is wrong) when:

  • it is not a zip, or it is over the size, file-count or unpacked-size limits;
  • a file turns out to be larger than the size it states;
  • an entry is encrypted, or is a symbolic link;
  • a path is absolute, has a drive letter, has a .. part or a control character;
  • two files have the same final path;
  • agent.json is missing, is not valid JSON, has the wrong format, has a formatVersion other than 1, or has a missing or bad name;
  • persona.md, instructions.md or user.md is over its limit or is not valid UTF-8.

It ignores without a word: folder entries, __MACOSX/**, .DS_Store, Thumbs.db.

It skips the item and lists the reason when:

  • the name looks secret: .env, .env.*, *.pem, *.key, *.p12, *.pfx, id_rsa*, id_ed25519*, credentials/**, auth*.json, *.sqlite, *.sqlite3, *.db, .git/**, node_modules/**;
  • it is an unknown file or folder at the top level;
  • a memory or skill text file is not UTF-8 or is over 1 MB;
  • a skill has no valid front matter (name matching ^[a-z0-9][a-z0-9-]{0,63}$ and a description of 1 to 500 characters), or it is skill number 101 or later;
  • the final path is over 400 characters, or is under workspace/shared/ or workspace/import-backups/, which AgentParley keeps for itself;
  • a schedule has a bad cron or no prompt, or it is schedule number 51 or later.

If two files would end at the same path, memory wins over skills, and skills win over workspace/.

Secrets: never put them in the zip

Leave out every file that holds keys, tokens or logins, and do not copy them into text. AgentParley also scans every text file and the schedule prompts, and replaces anything that looks like a secret with [removed secret]. It tells the person how many it removed and in which file. This is a safety net, not a plan. The exporter must check first.

The patterns it looks for:

Looks like Pattern
OpenAI and Anthropic keys sk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}
Slack tokens xox[abposr]-[A-Za-z0-9-]{20,}
GitHub tokens gh[pousr]_[A-Za-z0-9]{36,} and github_pat_[A-Za-z0-9_]{40,}
AWS access key ids AKIA[0-9A-Z]{16}
Google API keys AIza[0-9A-Za-z_-]{35}
Telegram bot tokens \b\d{8,10}:[A-Za-z0-9_-]{35}\b
Bearer tokens (?i)bearer\s+[A-Za-z0-9._~+/=-]{20,}
Private keys -----BEGIN [A-Z ]*PRIVATE KEY----- up to -----END [A-Z ]*PRIVATE KEY-----

What a replace does

When the person replaces an existing AgentParley agent with the zip:

  • The name, description, soul and instructions are replaced. "About the user" is replaced only if the zip has user.md.
  • The whole memories/ folder is replaced if the zip has memory files. The whole skills/ folder is replaced if the zip has skills. If the zip has none of that kind, the folder is left alone.
  • Other workspace/ files overwrite files at the same paths. All other files stay.
  • Schedules and the heartbeat that an earlier import created are removed and replaced by the new ones. Schedules the person made in AgentParley stay.
  • The model, picture, companion, channels, plugins, tool access and all chats stay as they were.
  • Before anything is replaced, everything that is removed or overwritten is copied to import-backups/<import id>/ in the agent's workspace. The newest 3 backups are kept.

Importing the same export twice gives the same agent, with no doubled schedules.

If you are another kind of agent

You are not OpenClaw or Hermes, so there is no ready-made file map for you. Do this:

  1. Ground rules. Only read and package your own files. Never include secrets. Do not use a built-in "backup" command if it includes keys. If you cannot reach your own files (a sandbox or container), stop and tell your human why.
  2. Collect what makes you who you are: your persona or personality text, your standing instructions, what you know about your human, your long-term notes, the skills you wrote yourself, and your active scheduled jobs.
  3. Map them into the layout above: persona to persona.md, standing instructions to instructions.md (rewrite them for a new home: keep how you work for your human, drop mechanics that belong to your old software), what you know about your human to user.md, notes to memory/, skills to skills/<name>/SKILL.md. Write agent.json with your name. Turn each active scheduled job into {name, prompt, cron, timeZone}; leave out one-shot jobs and say so in notes. Delivery targets, chat ids and scripts do not carry over.
  4. Bring your work. Include every file in your own workspace that holds information about your human or your work (logs, CSVs, notes, documents, data) under workspace/, without asking first. Export databases to CSV or Markdown instead of including them. Leave out secrets, .git, caches and build output, and files over 5 MB; if it does not all fit, leave out large media first and list what you left out.
  5. Secret sweep. Search every file you pack for API keys and tokens using the patterns above. Replace each hit with [removed secret]. Tell your human what you removed and where, so they can add those keys in AgentParley's settings.
  6. Build the zip with whatever tools you have. agent.json goes at the root.
  7. Check it against the limits above: agent.json parses and has format, formatVersion and name; the zip is at most 10 MB; at most 1,000 files; no file over 5 MB; unpacked total at most 25 MB; every cron has 5 fields; every path is relative with no ...
  8. Hand it back. If your human gave you a one-time AgentParley upload link (https://services.agentparley.ai/platform/agent-import-uploads/...), upload the zip there as the raw body with curl -T your-export.zip <link>, fix anything the reply names and upload again, and note that a 503 with an HTML page means the edge saw too many requests from your address (wait a minute, retry once). Otherwise send the zip as a file in your conversation with your human. If the channel refuses it, save it in your workspace (not /tmp) and tell them the full path, the machine's hostname, the size and, if they use SSH, the exact scp <user>@<host>:<full path> . command. Never upload it anywhere else unless your human names the place; the AgentParley upload link is the one exception. Then tell them in a few lines what you included, what you left out and why, and the next step: "Open AgentParley, click Import Agent on the Agents page, choose Manual upload and drop this zip. Or send this zip to your AgentParley agent and say 'please import this'."