Academy → Practical GuidesOfficial documentation · Arabic guidance

Running Hermes on a Personal or Work Machine

تأمين Hermes على جهاز شخصي أو جهاز عمل

Intermediate to advanced8 min readLesson 295 questions✓ 2026-08-18
Before you read

What this page is, and what it holds.

This page covers Running Hermes on a Personal or Work Machine. It carries a source warning and takes about 8 minutes to read. Do not disable approvals to save time. Start read-only and widen once you trust the results.

6sections
9code examples
2tables
1commands
1,291source words
The official one-line description

A security-posture walkthrough for running Hermes Agent on the machine you live on — what the defaults protect, how to tighten further, and how to undo mistakes

What you will be able to do

Outcomes taken from this page, not a template.

  • Understand what الأمان والموافقات is and when you need it.
  • Run hermes chat and understand what happens next.
  • Read the table and take only the row that applies to you.
  • Set HERMES_WRITE_SAFE_ROOT in the right place.
Identifiers you will meet

Exactly as they appear in Hermes.

Commands
  • hermes chat
Environment variables
  • HERMES_WRITE_SAFE_ROOT
  • TERMINAL_SSH_HOST
  • TERMINAL_SSH_USER
  • TERMINAL_SSH_KEY
  • GATEWAY_ALLOW_ALL_USERS
  • TELEGRAM_ALLOWED_USERS
  • GATEWAY_ALLOWED_USERS
Page map

Jump to the part you need.

  1. 01What the Defaults Already Protect
  2. 02Tightening for a Shared or Work Machine
  3. 03The Undo Layer: Checkpoints and `/rollback`
  4. 04What This Threat Model Is — and Isn't
  5. 05A Cautious Starting Config
  6. 06See Also
The full official page

Nothing summarised away.

The documentation body below is reproduced from the official source so commands and identifiers stay exact. Each section carries a short note describing what it contains.

You're about to run an agent on the machine you live on — a personal laptop or an employer-managed workstation. What's the safe posture?

Short answer: the defaults already do most of the work. Hermes ships secure-by-default, with a defense-in-depth model covering command approval, file-write safety, and credential handling. This page walks through what's on out of the box, which knobs to tighten for a shared or work machine, and how to undo mistakes when they happen. Every control here is covered in depth in the Security guide.

What the Defaults Already Protect

Explains the idea itself. Read it slowly; the later sections build on it.

Fresh install, no configuration — these protections are active:

Dangerous commands require approval. Before executing any command, Hermes checks it against a curated list of dangerous patterns — recursive deletes, writes to /etc/, disk operations, pipe-to-shell, and more. The default approvals.mode: smart uses an auxiliary LLM to assess risk: low-risk commands are auto-approved for that command only, genuinely dangerous commands are auto-denied, and uncertain cases escalate to a manual prompt.

Approval prompts fail closed. If you don't respond to an approval prompt within the timeout (default 300 seconds), the command is denied. Walking away from your desk never silently approves anything.

A hardline blocklist is the always-on floor. Some commands — rm -rf /, fork bombs, zeroing a physical disk — are refused regardless of approval mode, --yolo, or an explicit "allow always". The blocklist trips before the approval layer even sees the command, and there is no override flag.

File writes to sensitive paths are blocked. The write_file and patch tools cannot touch OS credential stores (~/.ssh/, ~/.aws/, ~/.kube/, /etc/sudoers, ~/.netrc), Hermes credential stores (auth.json, .env, pairing data), or project secret files (.env, .env.local, .envrc) anywhere on disk. Blocked writes return an error immediately — there is no approval prompt and no way to override from the chat UI.

Secrets are redacted from output. security.redact_secrets is on by default: patterns that look like API keys, tokens, and passwords in tool output are redacted before they enter the conversation context and logs.

Your data goes only where you point it. API calls go only to the LLM provider you configure. Hermes Agent does not collect telemetry, usage data, or analytics. Your conversations, memory, and skills are stored locally in ~/.hermes/. See the FAQ.

Tightening for a Shared or Work Machine

Carries a warning. Read it before running anything here. The upstream warning appears below.

On a machine with employer data, production credentials, or other people's files, layer these on top of the defaults.

Switch approvals to manual

smart mode auto-approves low-risk commands. If you want to see every flagged command yourself:

YAML2 lines
approvals:
  mode: manual

Manual mode always prompts you before executing a flagged command.

Add your own deny rules

approvals.deny is a list of glob patterns that block matching terminal commands unconditionally — even under --yolo, /yolo, or mode: off. It's the user-editable counterpart to the built-in hardline blocklist. Use it to declare things that must never run on this machine:

YAML5 lines
approvals:
  deny:
    - "git push --force*"
    - "*curl*|*sh*"
    - "dd if=* of=/dev/*"

Patterns are case-insensitive fnmatch ↗ globs matched against the whole command text, and matching runs over the same normalized/deobfuscated variants the dangerous-pattern detector uses, so simple quoting tricks don't slip past a rule. Always quote patterns — a bare leading * is a YAML parse error. Changes take effect immediately, no restart needed. Details: User-Defined Deny Rules.

Sandbox file writes

HERMES_WRITE_SAFE_ROOT restricts write_file and patch to the directory prefix(es) you list — anything outside is hard-blocked. Multiple roots are separated by : on Unix:

Shell1 line
export HERMES_WRITE_SAFE_ROOT=/path/to/project:/home/you/.hermes

Sensitive paths inside the safe root are still blocked — pointing it at $HOME does not allow writing ~/.ssh/id_rsa.

Move command execution off the host

The strongest isolation is not running commands on your machine at all. The terminal tool supports multiple backends:

BackendIsolation
localNone — runs on host (dangerous-command checks apply)
dockerContainer — the container itself is the security boundary
sshRemote machine — keeps execution on a separate server
YAML4 lines
terminal:
  backend: docker
  docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
  docker_forward_env: []  # Explicit allowlist only; empty keeps secrets out of the container

Every Docker container runs with hardened settings — all Linux capabilities dropped (with a minimal add-back set), no-new-privileges, a process-count limit, and size-limited tmpfs mounts. With a container backend, destructive commands inside the container can't harm the host, which is why dangerous-command checks are skipped there.

For ssh, set terminal.backend: ssh in config.yaml and provide host details via TERMINAL_SSH_HOST, TERMINAL_SSH_USER, and TERMINAL_SSH_KEY in ~/.hermes/.env. See Network Isolation.

If messaging is on: allowlists and pairing

Running the gateway on this machine? The default is already deny: if no allowlists are configured and GATEWAY_ALLOW_ALL_USERS is not set, all users are denied. Keep it explicit:

Shell3 lines
# ~/.hermes/.env
TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789

Or use DM pairing instead of hardcoding IDs: unknown users receive a one-time pairing code, and you approve them from the CLI with hermes pairing approve <platform> <code>. Never set GATEWAY_ALLOW_ALL_USERS=true on a machine you care about.

The Undo Layer: Checkpoints and `/rollback`

A lookup table. Do not read it all; find the row that applies to you. Commands here: hermes chat.

Approval gates prevent damage; checkpoints reverse it. When enabled, Hermes automatically snapshots your project before destructive operations — write_file, patch, and destructive terminal commands like rm, mv, sed -i, and git reset — into a shadow git store under ~/.hermes/checkpoints/store/. Your real project .git is never touched.

Checkpoints are opt-in. Enable per-session:

Shell1 line
hermes chat --checkpoints

Or globally:

YAML2 lines
checkpoints:
  enabled: true

Then, in a session:

CommandDescription
/rollbackList all checkpoints with change stats
/rollback diff <N>Preview what changed since checkpoint N
/rollback <N>Restore to checkpoint N (also undoes the last chat turn)
/rollback <N> <file>Restore a single file from checkpoint N

What This Threat Model Is — and Isn't

Explains the idea itself. Read it slowly; the later sections build on it.

Be clear-eyed about what these controls defend against. As the Security guide puts it:

Deny rules are a guardrail against an honest-but-wrong agent, the same threat model as the dangerous-pattern detector. They are not a sandbox against a deliberately adversarial process — for that, use an isolated backend (Docker, Modal) or an egress-restricted environment.

The same applies to the file-write guards: they apply to write_file and patch only, while the terminal tool runs as the same OS user. The denylist reduces accidental damage and gives models a clear stop signal; it does not sandbox a hostile or compromised agent. If your requirement is containment rather than guardrails, the answer is an isolated terminal backend — that's the boundary designed for it.

A Cautious Starting Config

Settings you configure once. Change one at a time so you can see what each does. Set HERMES_WRITE_SAFE_ROOT in your environment, not in the chat.

Everything above, assembled. Adjust to taste in ~/.hermes/config.yaml:

YAML17 lines
approvals:
  mode: manual                  # See every flagged command yourself
  timeout: 300                  # Unanswered prompts are denied (fail-closed)
  deny:                         # Never-run list — survives even /yolo
    - "git push --force*"
    - "*curl*|*sh*"
    - "dd if=* of=/dev/*"

security:
  redact_secrets: true          # Already the default; stated here for clarity

checkpoints:
  enabled: true                 # Snapshot before destructive operations

terminal:
  backend: docker               # Or ssh — keep execution off the host
  docker_forward_env: []        # No host secrets inside the container

And in ~/.hermes/.env, if you want the write sandbox:

Shell1 line
HERMES_WRITE_SAFE_ROOT=/path/to/project:/home/you/.hermes

See Also

Explains the idea itself. Read it slowly; the later sections build on it.

  • Security — the full defense-in-depth reference: every approval pattern, container hardening flags, gateway authorization, MCP credential filtering
  • Checkpoints & Rollback — configuration, store maintenance, and restore workflows
  • Tools & Toolsets — all terminal backends and their configuration
  • Configuration — the complete config.yaml reference
Knowledge check

5 questions answered by this page alone.

Every option is a real identifier from the Hermes documentation. The wrong ones are real too, just from other pages.

1. In this lesson's table, what is the “Isolation” for “ssh”?
2. Which of these environment variables actually appears in this lesson?
3. Which warning does the source state in this lesson?
4. Which of these headings does not appear in this lesson?
5. Which configuration key appears in this lesson's examples?