Wiki · Features in depth

Running commands and approvals

How to keep the agent from nagging during ordinary work while it still cannot wipe the server. Including what happens with unattended jobs.

✅ Verified 17. 10. 2026Source: official documentation →📋 Copy for your AI
🛂
Before the agent runs a command it goes through a check. Either it decides on its own or it asks you — depending on your settings. This page is about setting things up so the agent does not nag during ordinary work while still being unable to wipe the server. And about the fact that writing files has its own rules, which nobody is asked about.

When it asks and when it does not

ModeWhat it doesWho it is for
smart (default)An auxiliary model assesses the risk: a clearly safe command is approved for that one case, a genuinely dangerous one is auto-denied and uncertain ones escalate to youEveryday work — the best compromise
manualAlways asks when a dangerous command comes upWhen you want to see every risky step
offDisables all checks (the same as --yolo)Only in an isolated environment where nothing can escape
# ~/.hermes/config.yaml approvals: mode: smart # smart | manual | off timeout: 300 # seconds to wait for your decision cron_mode: deny # what scheduled jobs do unattended single_query_mode: deny # one-shot runs (hermes chat -q) unattended_mode: deny # webhooks and interfaces with nobody present

When nobody is around to click "approve"

A nightly job or a webhook has nobody to answer the prompt. Those situations therefore have their own setting: deny (the default) blocks the command and the agent must find another path; approve approves everything up front.

SituationSettingDefault
Scheduled job (cron)cron_modeblock
One-shot command hermes chat -qsingle_query_modeblock
Webhook, unattended APIunattended_modeblock

This matters for silent problems: when a nightly job hits a dangerous command and nobody clicks, the job simply does not finish and the refusal stays in the log. If you want such a job, design it to cope with being blocked.

YOLO mode (everything without asking)

HowScope
hermes --yolo or hermes chat --yoloThe whole run
/yolo in a conversationFrom that moment until the session ends

Never enable it where the agent works on a live site or where your keys and credentials live. In an isolated container or a scratch project it is a sensible choice.

Writing files: no prompt here, it is blocked outright

For file writes there is no "allow" dialog. Hermes checks the path against a list of protected places and refuses the write — with no way to override it from the chat:

Always protectedExamples
Access to the system and the cloudSSH keys, authorized_keys, AWS and Kubernetes credentials, sudoers
Hermes' own secrets.env, sign-in files, the vault, the browser profile, tool tokens, pairing files
Credential files inside a project.env.local, .env.production, .envrc — the agent must not read them, but it can write them for you

You can also narrow the write boundary to a single folder — then the agent may not write outside it (HERMES_WRITE_SAFE_ROOT). The protected places above stay blocked even if they sit inside that folder.

⚠️
Watch out for a silent mistake: when a write is blocked the agent gets an error — yet its summary may still claim the edit succeeded. Trusting the write-verification footer pays off more than trusting the closing sentence.

Where the agent runs, and what that means for checks

Where the terminal runsDangerous command checkWhat it suits
On your computeryesDevelopment and everyday work
On a remote server over SSHyesWorking on a server
In a container (Docker and similar)skipped — the container is the boundaryAlways-on operation once everything is isolated
In a cloud sandbox (Modal, Daytona, Vercel)skippedWork that should vanish with the machine

A skipped check is not a bug — it just means isolation, not prompts, is the protection. Check what is mounted into the container (folders, keys, network).

Pitfalls from our systems

What happenedWhat to do
A nightly job quietly did not finishIt hit a dangerous command with nobody to approve → the default is to block. Design the job to have another path, or grant it permission deliberately
The agent claimed it saved a file but did notThe write was blocked (protected path or outside the safe root). Check the write-verification footer, not the summary
The agent could not read .envThat is correct — credential files are not readable. When a value is needed, supply it as configuration rather than as file contents
Someone enabled "allow everything" on a production serverDo not. If you must, only for a limited time and knowing the agent can touch anything
An approval expired because we were awayThe default wait is 5 minutes. Either come back to decide or pick a mode that does not ask (and own its risk)
Moving into a container killed checkpoints tooInside a container paths belong to the container, so snapshots do not work. In container mode rely on git and backups

Our tips

TipWhy
Keep smart until you have a reason to change itIt approves most routine work and stops on truly risky things
Point the write boundary at your project folderThe agent then cannot write outside it, even by mistake
Assume scheduled jobs can be blockedA job must cope without approval, or it will fail silently
Never switch checks off "just to try" on a live systemThe risk shows up once and irreversibly

Where next

← Back to the wiki