Stories

15 stories, one command each. Every guard ships with the story it protects. messh publishes and verifies; it never grants access itself.

$messh login && messh publish && messh add mukul

Core loop: S-01 → S-03 → S-05.

P1 · SSH identity

MVP · now
IDStoryCommandGuard
S-01Claim a usernameGoogle → messh.io/<you>Reserved names, linked account shownScreen ›
S-02Install and log inmessh loginSigned releases, device codeDocs ›
S-03Publish keys and agentsmessh publish --agent claude-codeProof of possession private keys refusedScreen ›
S-04Look someone upmessh resolve mukulmessh verify; .keys needs no CLIScreen ›
S-05Grant access coremessh add mukulFingerprints and confirm, --fingerprint pinDocs ›
S-06Remove and syncmessh remove mukul · messh syncTagged lines only; keeps cache if messh is downDocs ›
S-07Revoke and rotatemessh keys revoke laptopNew-key alerts, propagation shownScreen ›
S-08Profile extras optionalx402 · feedNever shows who added whomScreen ›

P2 · Servers enforce policy

next
IDStoryCommandGuard
S-09messhd and policymesshd enroll --org acmeFleet revoke ≤ 60sScreen ›
S-10Request and TTLmessh request prod-02 --ttl 1hSigned request a person approves, max_ttlScreen ›
S-11Orgs and audittrust org:acme/*DNS-verified domain, full logScreen ›
S-12Pin host keysmessh ssh deploy@prod-01No StrictHostKeyChecking=noScreen ›

P3 · Signed API requests

preview · RFC 9421
IDStoryCodeGuard
S-13Agent signsMesshClient.create({ identity })Key in keychain or HSM, test vectorsScreen ›
S-14API verifiesapp.use(messhAuth())Every request cached keys, ±60s and nonceScreen ›
S-15API authorizescan(req.agent, "deploy", env)Your policy, your callScreen ›

Later · never

not on the roadmap

Later · only if customers ask

Delegation · scoped short-lived creds · cross-org trust · SSO/SCIM · SSH certificates · x25519 encryption

Never

messh granting access itself · storing private keys · a signing proxy in the request path · consumer browsing · full IAM on day one · custom crypto