Hermes Agent skills: write, install, supervise
Hermes Agent skills: the SKILL.md format, the eight install sources, the four trust levels, and the five things that break in production.

A skill is a document loaded on demand
An agent that knows everything is expensive on every turn, because everything it knows sits in its context permanently. Skills answer that by keeping the knowledge on disk and loading it only when it is useful. The documentation calls this progressive disclosure, and it comes in three levels.
| Level | Call | What comes back | Cost |
|---|---|---|---|
| 0 | skills_list() | name, description, category for each skill | around 3,000 tokens |
| 1 | skill_view(name) | the full content and its metadata | varies |
| 2 | skill_view(name, path) | one specific reference file | varies |
Level 0 is the only one the agent pays on every conversation. That is what lets you keep thirty skills installed without the bill moving, as long as none is opened. The practical consequence matters more than the mechanism: the description you write in the frontmatter is the only thing the agent sees before deciding. A vague description gives you a skill that never triggers.
Every skill lives under ~/.hermes/skills/, described in the documentation as the primary directory and source of truth. The format follows the open agentskills.io standard, so a skill written for Hermes Agent is not locked to Hermes Agent.
The SKILL.md format and what the frontmatter decides
A skill is a folder containing a mandatory SKILL.md file, plus optional subfolders: references/ for long documentation, templates/ for output formats, scripts/ for helpers, examples/ and assets/. The folder name becomes the skill's identifier.
The file opens with YAML frontmatter. Only two fields are mandatory, the rest decides when the skill shows up.
| Field | Status | Role |
|---|---|---|
name | required | the skill's identifier |
description | required | the only line the agent reads at level 0 |
version | optional | change tracking |
platforms | optional | restricts to macos, linux |
metadata.hermes.tags | optional | classification |
metadata.hermes.category | optional | grouping in the list |
metadata.hermes.config | optional | exposed settings, stored under skills.config |
The body follows a four-part shape in the official examples: when to use, procedure, pitfalls, verification. Verification is the section most often skipped, and it is the only one that lets the agent know whether it succeeded.
Four conditional fields decide visibility based on available tooling. They avoid offering a procedure the agent cannot run.
| Field | Behaviour |
|---|---|
requires_toolsets | the skill is hidden when the listed toolsets are missing |
fallback_for_toolsets | the skill is hidden when the listed toolsets are present |
requires_tools | same logic, tool by tool |
fallback_for_tools | same logic inverted, tool by tool |
The fallback_for_toolsets case is the most useful and the least obvious: it is how you write the fallback procedure. If the web toolset is there, the skill stays invisible. If it is missing, it appears and explains how to do it another way.
A skill can finally declare the environment variables it needs, with a prompt label and a help link. Once set, the documentation states they are passed through automatically to the execute_code and terminal sandboxes. That is convenient, and it is also the moment to look at what the skill is asking for, since the secret will follow.
Installing from the hub: eight sources, four trust levels
Installing goes through hermes skills install, and the source decides almost everything. Eight are documented.
| Source | Identifier | What it is |
|---|---|---|
| Official | official | optional skills from the Hermes repo |
| skills.sh | skills-sh | Vercel's public directory |
| Well-known endpoints | well-known | sites publishing /.well-known/skills/index.json |
| Direct GitHub | github | any repository |
| ClawHub | clawhub | third-party marketplace |
| LobeHub | lobehub | conversion of an agent catalogue |
| browse.sh | browse-sh | 200+ browser-automation skills |
| Direct URL | url | any link to a SKILL.md |
The default GitHub taps are openai/skills, anthropics/skills, huggingface/skills and NVIDIA/skills. Everything arriving through the hub goes through a security scanner looking for data exfiltration, prompt injection, destructive commands and supply-chain signals. The scan result is then weighed against the source's trust level.
| Level | Source | Policy |
|---|---|---|
builtin | ships with Hermes | always trusted |
official | optional-skills/ | built-in trust |
trusted | default taps | permissive policy |
community | everything else | block overridable with --force |
The thing to remember about --force: it lifts caution-level blocks, never a dangerous verdict. When the scanner genuinely rules, the flag does nothing, and that is the behaviour you want.
Three commands cover daily use. hermes skills check reports what moved upstream, hermes skills update reinstalls what changed, and hermes skills audit re-runs the scanner over what is already installed. The last one is the forgotten one: a skill that was safe on install day does not necessarily stay safe after its origin repository updates.
Stop writing SKILL.md by hand
The /learn command takes a source and turns it into a skill, without you writing the file. The documentation presents it as the fast way to turn something you already know, or a pile of reference material, into a reusable skill. Four call shapes are documented.
- a code folder, with an angle:
/learn the REST client in ~/projects/acme-sdk, focus on auth + pagination - a documentation URL:
/learn https://docs.example.com/api/quickstart - what the agent just did:
/learn how I just deployed the staging server - a dictated procedure, in plain language
The implementation detail that matters: /learn adds no extra tool to the model. It builds a standards-guided prompt and hands it to the agent as a normal turn, which saves the result with the skill_manage tool. That is why the command behaves identically in the CLI, the messaging gateway, the TUI and the dashboard.
Bundles cover the other need, loading several skills at once. A YAML file under ~/.hermes/skill-bundles/ lists the skills and can add a shared instruction, prepended to the loaded content. You manage them with hermes bundles create, list, show, delete and reload.
Two behaviours to know before leaning on them. A bundle takes precedence over an individual skill when slugs collide, which can silently mask a skill you thought you were calling. And a missing skill inside a bundle is skipped rather than fatal, so a bundle referencing an uninstalled skill keeps working quietly, with a piece missing.
On the calling side, up to five skills can be invoked in one message. Parsing stops at the first token that is not an installed skill, which keeps a file path starting with a slash from being swallowed along the way.
When the agent writes its own skills
Hermes Agent can create, modify and delete skills on its own, through the skill_manage tool. The documentation lists four triggers: after a complex task of at least five tool calls, on discovering a non-trivial workflow, after hitting errors and finding the path that works, and when you correct it.
| Action | Use | Parameters |
|---|---|---|
create | new skill | name, content, optional category |
patch | targeted fix, preferred | name, old_string, new_string |
edit | structural rewrite | name, content |
delete | removal | name |
write_file | supporting file | name, file_path, file_content |
remove_file | remove a supporting file | name, file_path |
The documentation recommends patch over edit for a cost reason: only the changed text appears in the tool call. On a skill of several thousand words corrected often, the difference shows on the bill.
The default behaviour is to write freely. That is the setting to change first if the agent runs on a shared machine or in production. The approval gate turns on with skills.write_approval set to true, and every write then lands under ~/.hermes/pending/skills/ waiting for your call.
/skills pendinglists what is staged/skills diff <id>shows the full diff/skills approve <id>applies it,allfor everything/skills reject <id>drops it,allfor everything/skills approval ontoggles the gate
One naming trap is worth flagging: the skills.guard_agent_created setting looks like an approval gate and is not one. It is a content scanner looking for dangerous patterns, and the documentation states the two settings are independent. Turning one on gives you nothing of the other.
The five things that break
None of these is a project defect. They are documented behaviours that surprise people who meet them in production rather than on the page.
- The GitHub limit of 60 requests per hour. Hub operations go through the GitHub API, and without a token you are capped at 60 requests hourly. A
GITHUB_TOKENin the.envfile raises it to 5,000. It is the first failure you hit installing a batch of skills at once. - External directories protect nothing. You can add folders through
skills.external_dirs, with tilde and variable expansion. The documentation says explicitly this is not a write-protection boundary: the agent modifies existing skills in place, wherever they sit. - Local precedence is silent. If the same name exists locally and in an external directory, the local version wins. A shared team repository can therefore be neutralised on one machine without anyone seeing an error.
- Non-existent paths are skipped quietly. A typo in
external_dirsproduces no warning, just skills that never appear. - Profile isolation applies to skills too. Each profile has its own
.bundled_manifestunder its ownHERMES_HOME, so a reset run on one profile leaves the others alone. Handy once you know, baffling while you wonder why the command did nothing.
On removal, a reassuring nuance: hermes skills opt-out only stops future seeding and deletes nothing already on disk. The --remove flag is what erases, and only bundled skills that were left unmodified.
The rule we apply at our clients fits in one sentence: a skill installed from a community source gets read before it is enabled, the way you would read a dependency added to the project. The scanner catches a lot, it does not catch a plausible procedure that sends your data to the wrong place.
FAQ
- Can a Hermes Agent skill execute code?
- A skill does not execute on its own, it holds instructions the agent reads and then applies with its own tools. It can carry scripts under
scripts/and declare environment variables passed through to theexecute_codeandterminalsandboxes. That chain is why an outside skill deserves a read before it is enabled. - How many skills can you install before the bill moves?
- The permanent cost is level 0, around 3,000 tokens for the list of names and descriptions. Full content loads only when the agent opens a skill. A wide library therefore stays cheap, provided descriptions are precise enough that the agent does not open three skills before finding the right one.
- How do you stop the agent editing its own skills?
- Set
skills.write_approvaltotruein the configuration. Writes then land under~/.hermes/pending/skills/and wait for approval through/skills approve. Mind the neighbouringskills.guard_agent_createdsetting, which is a content scanner and not an approval gate: the two are independent. - Is the security scanner enough to install any skill?
- The scanner looks for data exfiltration, prompt injection, destructive commands and supply-chain signals, and the
--forceflag never lifts adangerousverdict. It is still an automatic filter: a plausible but badly aimed procedure will pass. For a community source, a human read still earns its keep. - Why does my skill never show up in the list?
- Three causes cover most cases. A
requires_toolsetsfield hiding the skill because the expected tooling is missing, a name identical to a local skill that wins by precedence, or a wrong path inskills.external_dirs, skipped silently. Check in that order before touching the content. - Can a team share skills?
- Yes, through a GitHub tap. A repository with a
skills/folder holding one subfolder per skill is added withhermes skills tap add, and the folder name becomes the install slug. Sharing throughskills.external_dirsalso works but does not prevent local edits, and a local version of the same name wins. - Should you re-check skills that are already installed?
- Yes, and it is the most forgotten command.
hermes skills checkreports upstream changes,hermes skills updatereinstalls, andhermes skills auditre-runs the scanner over what is installed. A skill cleared on install day does not stay cleared when its origin repository moves.
Sources and references
- Hermes Agent, Skills System
The `SKILL.md` format, the three loading levels, the eight hub sources, the trust levels, the `skill_manage` tool and the approval gate, checked on 3 August 2026.
- Hermes Agent, README
The `~/.hermes/skills/` location, agentskills.io compatibility and the learning loop. A repository past twenty thousand commits, worth reopening before any update.
- agentskills.io
The open standard the format follows, which makes a skill reusable outside Hermes Agent.
Scope your first AI agent
20 minutes to review your tools, data and the first useful case. No jargon, no commitment.