Installing a skill normally looks like this:
hermes skills install merge-reconciler
That is a name. It only works where a registry knows the name, it trusts whoever controls that name, and it says nothing about the bytes you receive.
This is the same install, as a token:
npx skillseal add sk1qyx…
The token carries the proof with it, so the registry becomes optional and the download becomes untrusted.
| Fingerprint | the hash of the skill's contents — what counts as correct |
| Publisher key | who vouches for it |
| Signature | proof they vouched for exactly these contents |
| Locations | optional places to look, none of them trusted |
| Name | a label for humans, never used to decide anything |
| Contents | for a very small skill, the skill itself travels inside the token |
It is written in bech32m, the same encoding as a Lightning invoice: it has a checksum, so a token damaged by copy and paste is rejected instantly and offline, and it has no look-alike characters. A typical token is about 250 characters.
✓ token checksum is valid
✓ signed by 5a142b0c2d720f3d…
✓ file list matches the token
✓ all 4 files match their entries
installed csv-stats → Claude Code / Claude Desktop
In order:
- the checksum, offline, before any network call
- the signature, so you know who published these exact contents
- the file list, which must hash to the fingerprint in the token
- every file, which must hash to its entry in that list
- only then is anything written where an agent can see it
Nothing is executed during an install. Installing a skill never runs it.
If any check fails, the install refuses and nothing is written — measured: corrupting one file in the source leaves zero files on disk.
Files are stored under a path derived from their own fingerprint, so an S3 bucket, a static web server, an IPFS gateway, or a Filecoin-backed provider all work without changes. Every location in the token is tried at once and the first correct answer wins.
Because the fingerprint decides what is acceptable, a hostile mirror can only fail to answer. It can never answer with something else. That is what makes it safe to fetch from infrastructure nobody vetted, which is what "decentralized" has to mean in practice.
There is no plugin. A skill is installed as a plain
Agent Skills folder — a SKILL.md with its
frontmatter, plus any scripts/, references/ and assets/ — placed where the
agent already looks. Claude Code, Hermes, goose, Cursor, Codex, OpenCode,
OpenHands, Letta, Amp, Gemini CLI and Copilot all read that format today, so
support is a line in a table rather than an integration, and progressive
disclosure keeps working untouched.
skillseal where # which agents are on this machine
skillseal add sk1… # install for the ones foundNothing existing breaks: name-based installs keep working, and the token is simply another accepted argument.
The same checks are exposed as an MCP tool, install_skill(token), so an agent
can accept a pasted token directly and report what it verified — or refuse.
skillseal publish ./my-skill --from https://s3.filebase.com/my-bucketThis prints the fingerprint, the publisher key, and the ready-to-paste line. Upload each file under its fingerprint and the skill is installable by anyone, anywhere, with no account and no registry entry.
It proves who published a skill and that the bytes are exactly what they published. It does not tell you the skill is well behaved. Reading a skill before you run it still matters; the token removes the question of whether you are reading the same thing the agent will run.
Key trust is on first use: the first token from a publisher establishes their key, and a later change is surfaced rather than accepted silently.