Run multiple Hermes agents with profiles
A Hermes Agent profile is a separate Hermes home directory with its own config, API keys, SOUL.md, memory, sessions, skills, cron jobs and gateway state. Run hermes profile create coder and you get an independent agent with its own coder command, so a coding assistant, a personal bot and a research agent can run side by side without mixing their state.
What is a Hermes profile?
A profile is a separate Hermes home directory, so each profile is an independent agent with its own settings and state. Named profiles live under ~/.hermes/profiles/<name>/, and the default profile is ~/.hermes itself. You can use profiles to keep a coding assistant, a personal bot and a research agent apart on one machine.
The docs use a few related terms that are easy to mix up:
- Profile: the persistent home for an agent's configuration and data.
- Agent: the running Hermes assistant that uses a profile.
- Messaging bot: an account on Telegram, Discord, Slack or another platform, connected through the gateway with its own bot token.
- Subagent: a short-lived child spawned by
delegate_taskwith a fresh conversation. A separate conversation is not a separate profile.
One rule matters more than the rest: never point two agent processes at the same profile. Both would write memory automatically and load each other's writes at the next session start. If two agents need shared memory, the docs recommend an external memory provider instead.
What does each profile have its own copy of?
Each profile has its own configuration, secrets, persona, memory, skills, sessions and scheduled work. Hermes scopes all of this through the HERMES_HOME environment variable, which the profile's command sets before it starts.
| Item | Stored in the profile as | What it controls |
|---|---|---|
| Configuration | config.yaml |
Model, provider, toolsets, all settings |
| Secrets | .env |
API keys and bot tokens |
| Persona | SOUL.md |
Personality and tone |
| Memory | memories/MEMORY.md, memories/USER.md |
What the agent knows about its environment and you |
| Skills | skills/ |
Bundled skills are seeded when the profile is created |
| Sessions | state.db and session files |
Conversation history |
| Scheduled work | cron jobs | Jobs that belong to this agent |
| Gateway state | PID, logs, pairing data | The profile's own messaging gateway |
Some things are shared on purpose. The code is installed once, and hermes update pulls it once and syncs new bundled skills to every profile without overwriting skills you changed. On host installs, tool subprocesses keep your real OS HOME by default, so git, ssh and gh use the same credentials in every profile. Set terminal.home_mode: profile in a profile's config.yaml if you need separate CLI identities.
How do you create, list, switch and delete profiles?
Use the hermes profile commands. Creating a profile also creates a command with the same name.
hermes profile create coder # new profile plus a "coder" command
coder setup # set its model, API keys and bot tokens
coder chat # chat with this agent
hermes profile list # all profiles with their status
hermes profile show coder # details for one profile
hermes profile use coder # make coder the default for plain "hermes"
hermes profile use default # switch back
hermes profile rename coder dev-bot # rename, updating the command
hermes profile delete coder # asks you to type the name to confirm
hermes profile delete stops the profile's gateway, removes its service and command, and deletes all of its data. Add --yes to skip the confirmation. You cannot delete the default profile, because it is ~/.hermes itself. Use hermes uninstall to remove everything.
You can also target any profile with the -p flag, for example hermes -p coder doctor. The CLI shows which profile is active in the prompt (coder ❯) and in the startup banner.
If a profile will take work from the kanban board, give it a role description when you create it:
hermes profile create researcher --description "Reads source code and external docs, writes findings."
Should you clone an existing profile?
Clone when you want a new agent that starts from an existing setup. Each option copies a different amount.
| Command | What it copies | What starts empty |
|---|---|---|
hermes profile create mybot |
Bundled skills only | Everything else |
hermes profile create work --clone |
config.yaml, .env, SOUL.md, skills, MEMORY.md, USER.md, installed plugins |
Sessions, state.db, cron jobs |
hermes profile create backup --clone-all |
Config, API keys, personality, all memories, skills and plugins | Session history, state.db, backups, cron jobs |
hermes profile create work --clone-from coder |
Like --clone, but from the profile you name |
Same as --clone |
No clone copies messaging channels. Bot tokens, allowlists and platform sections are left behind because a bot can belong to only one profile. Add --clone-channels only if you really want to keep them. OAuth logins for Anthropic, OpenAI Codex and xAI are shared through the root ~/.hermes/auth.json rather than copied. To give a profile its own login, run hermes -p <name> auth add <provider>.
How do profile command aliases work?
Every profile gets a wrapper script at ~/.local/bin/<name> that runs hermes -p <name>, so it works with every Hermes subcommand.
coder gateway start
coder doctor
coder skills list
coder config set model.default anthropic/claude-sonnet-4
For tab completion of profile names, add eval "$(hermes completion bash)" (or the zsh version) to your shell profile.
How do you run several messaging gateways?
Each profile runs its own gateway as a separate process with its own bot token. Put a different Telegram, Discord or Slack token in each profile's .env, usually through <name> setup.
coder gateway start # starts coder's gateway
assistant gateway start # a separate process for assistant
coder gateway install # creates a hermes-gateway-coder service
assistant gateway install # creates a hermes-gateway-assistant service
If two profiles use the same bot token by accident, the second gateway is blocked with an error that names the conflicting profile. This lock covers Telegram, Discord, Slack, WhatsApp and Signal.
The alternative is a single multiplexing gateway that serves every profile from one process. Platforms that use one credential per bot still need their own token for each profile in that mode.
How do you set a profile's working directory?
Set an absolute terminal.cwd in that profile's config. The working directory is where terminal commands start, and it is separate from the profile directory.
terminal:
backend: local
cwd: /absolute/path/to/project
Or from the command line:
coder config set terminal.cwd /absolute/path/to/project
On the local backend, cwd: "." means the directory you launched Hermes from, not the profile directory.
Are profiles a sandbox?
No. A profile separates Hermes state, but it does not limit what files the agent can reach. On the default local terminal backend, the agent has the same filesystem access as your user account, and SOUL.md instructions do not enforce a boundary either. If you need isolation, use a sandboxed terminal backend such as Docker or a separate machine.
How do you move or share a profile?
Export a profile to a single archive, or publish it as a git repository others can install.
hermes profile export coder # coder.tar.gz, API keys stripped
hermes profile import ./coder.tar.gz --name coder
hermes profile install github.com/you/research-bot --alias
A profile export leaves out credentials by design, so it is not a full backup. Use hermes backup when you want everything.
FAQ
Do Hermes profiles share memory?
No. Each profile has its own MEMORY.md and USER.md, and a profile never falls back to another profile's memory. If several agents need shared memory, use an external memory provider.
Can two profiles use the same Telegram bot token?
No. A bot can belong to only one profile, and if two profiles use the same token the second gateway is blocked with an error naming the conflicting profile.
Does a profile limit which files the agent can access?
No. Profiles separate Hermes state but are not a sandbox. On the local backend the agent has your user account's file access, so use Docker or another sandboxed backend for isolation.
How do I update every profile?
Run hermes update once. It updates the shared code and syncs new bundled skills to all profiles, and it never overwrites skills you have modified.
Can I delete the default profile?
No. The default profile is ~/.hermes itself, so hermes profile delete refuses it. Use hermes uninstall if you want to remove everything.
Sources
Repos to try next
Browse the categoryAgent harness with swarms, memory and MCP tools for Claude Code, Codex and other MCP clients
spinabot BrigadeSelf-hosted crew of AI agents on an org chart with shared long-term memory and chat-app access
MervinPraison PraisonAIPython framework for autonomous single and multi-agent systems with memory, RAG, tools and MCP
EverMind-AI RavenPre-alpha host agent that builds task DAGs and orchestrates built-in and third-party agents
HarnessRouter HarnessRouterSelf-hosted unified API that runs Codex, Claude Code, Hermes and other agent harnesses
wanikua DanghuangshangMulti-agent team modeled on Ming dynasty government, built on OpenClaw with a Hermes Agent runtime option