Documentation

Article

Introduction

Learn about messh, one name for your SSH keys and for the agents that act for you.

Name
mmukulmessh.io/mukul
Resolves to
  • laptopSHA256:7b1Qx9…09de
  • devboxSHA256:c44aP2…81f0
  • bbuild-botSHA256:dPdarb…kpIQ
Checked by
  • prod-02sshd · authorized_keys
  • staging-01messhd · 1h access
  • api.acme.devRFC 9421 signature
A name resolves to the keys its owner has proven they hold, including keys for their agents. Servers and APIs check the name, not a pasted key or a token.

messh is an identity layer built on SSH keys. Every account has a name, like mukul, that resolves to the public keys its owner has proven they hold, and to the agents they run. Each agent has a key of its own.

Servers use the name to decide who can log in: messh add mukul writes those keys to authorized_keys and keeps them current. APIs use it to decide who is calling: each request is signed with the caller’s key and checked against the name.

Names are public, so you can resolve one without an account:

$curl https://messh.io/mukul.keys

Vision#

SSH keys are the one public-key credential nearly every developer already has. Servers already trust them, and the private half never has to leave the machine that made it.

But a key has no name. It gets pasted into authorized_keys, copied from server to server, and outlives the job it was for. Agents have it worse: most run on a token copied from a settings page, with no owner, no expiry and no signature.

Three things now make a better answer possible:

  • Every machine can sign. OpenSSH ships with every major OS, and ssh-keygen -Y sign signs any data with the key you already have.
  • HTTP has a signature standard. RFC 9421 lets a request carry a signature over its method, path and headers, and RFC 9530 adds a digest of the body.
  • Agents act on their own. They push code, call APIs and log in to servers. They need identities you can name, scope and revoke without touching yours.

We think access should follow a name, not a key file or a token. The name resolves to keys its owner has proven they hold, agents get names of their own, and every request is signed by one of those keys. messh is that name.

Roadmap#

  1. SSH identityAvailablePublish keys under your name, and add people to servers by name.
  2. Server policyBetamesshd keeps servers in sync and adds time-boxed access with approvals.
  3. Signed API requestsPreviewAgents sign HTTP requests with RFC 9421. APIs verify them with one middleware, in five languages.
  4. Agent authorizationPlannedGrants an agent can prove: what it may do, for whom, and until when.

Features#

  • One name, every key. messh.io/mukul lists each key you’ve verified, with a label and a fingerprint. Share the name and the keys follow.
  • Proof of possession. A key is listed only after it signs a challenge, so no one can claim a key they don’t hold. Private keys are refused.
  • Agents with their own keys. An agent publishes its own key under your name, like build-bot, and signs with it. It never borrows yours.
  • Plain authorized_keys. messh add writes tagged lines and touches nothing else. There’s no sshd plugin and no daemon to run.
  • Revocation that reaches servers. Revoke a key once and messh sync or messhd removes it wherever it was added. A failed lookup never removes access.
  • Time-boxed access. An agent asks for access with a reason and a TTL. A person approves it, and it expires on its own.
  • Signed requests. Ed25519 signatures over RFC 9421, with SDKs for JS/TS, Python, Go, Rust and Java.
  • Open by default. The keys endpoint is public and cacheable, and the wire format ships with test vectors, so you can verify requests without our code.

Use cases#

messh suits teams that already use SSH keys, and APIs that can check a signature on each request. Common uses:

  • Team servers. Grant access with messh add alice instead of collecting keys in chat. Offboarding is one revoke.
  • Fleet bootstrap. cloud-init runs messh add --yes, so a new machine trusts the right people on first boot.
  • CI and deploy bots. A named agent key replaces the shared deploy key and the long-lived token.
  • Coding agents. Claude Code or Codex sign as mukul/claude-code, so every push and API call has an owner.
  • Internal APIs. One middleware tells you which person or agent is calling, and whether you trust them.
  • Incident access. Access is time-boxed, approved and logged with its reason, then it expires.

See also#

  • InstallOne signed binary for macOS and Linux, then messh login.
  • messh CLISix commands. login, publish and add are the core loop.
  • API authenticationSign and verify HTTP requests in JS/TS, Python, Go, Rust and Java.
  • Use casesEvery story, from first login to a signed agent request.

Updated Oct 21, 2026

↑ ↓ to move↵ to openesc to close