hermes-agent/website/docs/user-guide/profiles.md
Teknium f6db1b27ba
feat: add profiles — run multiple isolated Hermes instances (#3681)
Each profile is a fully independent HERMES_HOME with its own config,
API keys, memory, sessions, skills, gateway, cron, and state.db.

Core module: hermes_cli/profiles.py (~900 lines)
  - Profile CRUD: create, delete, list, show, rename
  - Three clone levels: blank, --clone (config), --clone-all (everything)
  - Export/import: tar.gz archive for backup and migration
  - Wrapper alias scripts (~/.local/bin/<name>)
  - Collision detection for alias names
  - Sticky default via ~/.hermes/active_profile
  - Skill seeding via subprocess (handles module-level caching)
  - Auto-stop gateway on delete with disable-before-stop for services
  - Tab completion generation for bash and zsh

CLI integration (hermes_cli/main.py):
  - _apply_profile_override(): pre-import -p/--profile flag + sticky default
  - Full 'hermes profile' subcommand: list, use, create, delete, show,
    alias, rename, export, import
  - 'hermes completion bash/zsh' command
  - Multi-profile skill sync in hermes update

Display (cli.py, banner.py, gateway/run.py):
  - CLI prompt: 'coder ❯' when using a non-default profile
  - Banner shows profile name
  - Gateway startup log includes profile name

Gateway safety:
  - Token locks: Discord, Slack, WhatsApp, Signal (extends Telegram pattern)
  - Port conflict detection: API server, webhook adapter

Diagnostics (hermes_cli/doctor.py):
  - Profile health section: lists profiles, checks config, .env, aliases
  - Orphan alias detection: warns when wrapper points to deleted profile

Tests (tests/hermes_cli/test_profiles.py):
  - 71 automated tests covering: validation, CRUD, clone levels, rename,
    export/import, active profile, isolation, alias collision, completion
  - Full suite: 6760 passed, 0 new failures

Documentation:
  - website/docs/user-guide/profiles.md: full user guide (12 sections)
  - website/docs/reference/profile-commands.md: command reference (12 commands)
  - website/docs/reference/faq.md: 6 profile FAQ entries
  - website/sidebars.ts: navigation updated
2026-03-29 10:41:20 -07:00

7.2 KiB

sidebar_position
2

Profiles: Running Multiple Agents

Run multiple independent Hermes agents on the same machine — each with its own config, memory, sessions, and gateway.

What are profiles?

A profile is a fully isolated Hermes environment. Each profile gets its own HERMES_HOME directory containing its own config.yaml, .env, SOUL.md, memories, sessions, skills, and state database. Profiles let you run separate agents for different purposes — a personal assistant, a work bot, a dev agent — without any cross-contamination.

Each profile also gets a shell alias (e.g., hermes-work) so you can launch it directly without flags.

Quick start

# Create a profile called "work"
hermes profile create work

# Switch to it as the default
hermes profile use work

# Launch — now everything uses the "work" environment
hermes

That's it. From now on, hermes uses the "work" profile until you switch back.

Creating a profile

Blank profile

hermes profile create mybot

Creates a fresh, empty profile. You'll need to run hermes setup (or hermes-mybot setup) to configure it from scratch — provider, model, gateway tokens, etc.

Clone config only (--clone)

hermes profile create work --clone

Copies your current profile's config.yaml, .env, and SOUL.md into the new profile. This gives you the same provider/model setup without copying memories, sessions, or skills. Useful when you want a second agent with the same API keys but different personality or gateway tokens.

Clone everything (--clone-all)

hermes profile create backup --clone-all

Copies everything — config, memories, sessions, skills, state database, the lot. This is a full snapshot of your current profile. Useful for creating a backup or forking an agent that already has learned context.

Using profiles

Shell aliases

Every profile gets an alias installed to ~/.local/bin/:

hermes-work       # Runs hermes with the "work" profile
hermes-mybot      # Runs hermes with the "mybot" profile
hermes-backup     # Runs hermes with the "backup" profile

These aliases work with all subcommands:

hermes-work chat -q "Check my calendar"
hermes-work gateway start
hermes-work skills list

Sticky default (hermes profile use)

hermes profile use work

Sets "work" as the active profile. Now plain hermes uses the work profile — no alias or flag needed. The active profile is stored in ~/.hermes/active_profile.

Switch back to the default profile:

hermes profile use default

One-off with -p flag

hermes -p work chat -q "Summarize my inbox"
hermes -p mybot gateway status

The -p / --profile flag overrides the sticky default for a single command without changing it.

Running gateways

Each profile runs its own independent gateway. This means you can have multiple bots online simultaneously — for example, a personal Telegram bot and a team Discord bot:

hermes-personal gateway start    # Starts personal bot's gateway
hermes-work gateway start        # Starts work bot's gateway

Each gateway uses the tokens and platform config from its own profile's config.yaml and .env. There are no port or token conflicts because each profile is fully isolated.

:::warning Each bot token (Telegram, Discord, etc.) can only be used by one profile at a time. If two profiles try to use the same token, the second gateway will fail to connect. Use a separate bot token per profile. :::

Configuring profiles

Each profile has its own independent configuration files:

~/.hermes/profiles/work/
├── config.yaml        # Model, provider, gateway settings
├── .env               # API keys, bot tokens
├── SOUL.md            # Personality / system prompt
├── skills/            # Installed skills
├── memories/          # Agent memories
├── state.db           # Sessions, conversation history
└── logs/              # Gateway and agent logs

Edit a profile's config directly:

hermes-work config edit          # Opens work profile's config.yaml
hermes -p work setup             # Run setup wizard for work profile

Or edit the files manually:

nano ~/.hermes/profiles/work/config.yaml
nano ~/.hermes/profiles/work/.env
nano ~/.hermes/profiles/work/SOUL.md

The default profile lives at ~/.hermes/ (not in the profiles/ subdirectory).

Updating

hermes update

hermes update pulls the latest code and reinstalls dependencies once. It then syncs the updated skills to all profiles automatically. You don't need to run update separately for each profile — one update covers everything.

Managing profiles

List profiles

hermes profile list

Shows all profiles with their status. The active profile is marked with an asterisk:

  default
* work
  mybot
  backup

Show profile details

hermes profile show work

Displays the profile's home directory, config path, active model, configured platforms, and other details.

Rename a profile

hermes profile rename mybot assistant

Renames the profile directory and updates the shell alias from hermes-mybot to hermes-assistant.

Export a profile

hermes profile export work ./work-backup.tar.gz

Packages the entire profile into a portable archive. Useful for backups or transferring to another machine.

Import a profile

hermes profile import ./work-backup.tar.gz work-restored

Imports a previously exported profile archive as a new profile.

Deleting a profile

hermes profile delete mybot

Removes the profile directory and its shell alias. You'll be prompted to confirm. This permanently deletes all config, memories, sessions, and skills for that profile.

:::warning Deletion is irreversible. Export the profile first if you might need it later: hermes profile export mybot ./mybot-backup.tar.gz :::

You cannot delete the currently active profile. Switch to a different one first:

hermes profile use default
hermes profile delete mybot

Tab completion

Enable shell completions for profile names and subcommands:

# Generate completions for your shell
hermes completion bash >> ~/.bashrc
hermes completion zsh >> ~/.zshrc
hermes completion fish > ~/.config/fish/completions/hermes.fish

# Reload your shell
source ~/.bashrc   # or ~/.zshrc

After setup, hermes profile <TAB> autocompletes subcommands and hermes -p <TAB> autocompletes profile names.

How it works

Under the hood, each profile is just a separate HERMES_HOME directory. When you run hermes -p work or hermes-work, Hermes sets HERMES_HOME=~/.hermes/profiles/work before starting. Everything — config loading, memory access, session storage, gateway operation — reads from and writes to that directory.

The sticky default (hermes profile use) writes the profile name to ~/.hermes/active_profile. On startup, if no -p flag is given, Hermes checks this file and sets HERMES_HOME accordingly.

Profile aliases in ~/.local/bin/ are thin wrapper scripts that set HERMES_HOME and exec the real hermes binary. This means profiles work with all existing Hermes commands, flags, and features without any special handling.