IntentMesh

intent/1 · an open format

What your organisation intends to do next, as a file anyone can read.

Every company knows what it is working on. Almost none can tell another company, in a form a machine can read, without a meeting. intent/1 is the fix: one file per repository, published at your own domain, merged by anyone. No account, no server, no dependencies.

$ npx intentmesh adopt

The shape

A publisher serves the public projection at https://yourcompany.com/.well-known/intent.json:

{
  "intent": "1",
  "source": "repo/yourcompany",
  "org": "org/yourcompany",
  "generated": "2026-08-30T18:00:00Z",
  "items": [
    {
      "id": "intent/yourcompany/settlement-rails",
      "kind": "initiative",
      "title": "Settlement rails for cross-border payouts",
      "status": "open",
      "wants": ["payments", "compliance"],
      "visibility": "public",
      "expires": "2026-11-28"
    }
  ]
}

That is the whole protocol. Anyone can fetch it. Anyone can merge yours with theirs. Nobody has to run anything. The specification fits in your head; the JSON Schema fits in your CI.

Why this becomes the standard

Agents are starting to act on organisations' behalf, and the first question an agent asks about a counterparty — what are they trying to do? — currently has no machine-readable answer anywhere on the web. The format that answers it will be boring, self-hosted, and verifiable, the way robots.txt and sitemap.xml won: not the richest format, the one nobody has to trust. intent/1 is built to be that format, and its governance page is the list of things its owner cannot do to you later.

Three decisions that are not obvious

An intention decays

Every item has an expires, derived from its kind — never accepted as input. A caller that could write its own expiry could keep a stale intention alive forever. An intention nobody restates stops being evidence; a backlog everyone has stopped believing is worse than none, because it still looks like one.

Publishing requires a human, structurally

file() has no visibility parameter — it cannot produce anything but private. Reaching public requires promote(), which throws unless the caller passes a person/… id. Not a policy check a flag could bypass: the absence of a parameter. An agent may draft an intention all day and cannot publish one.

The served copy is a projection, not a copy

The emitter writes the public projection itself. There is no "copy the file to public/" step, because a copy step can be forgotten — and forgetting it publishes private items at a URL.

Where it sits

MCP connects agents to tools. A2A connects agents to agents. Payment rails move the value. intent/1 sits before all of them: it is how two organisations discover they want the same thing, before any agent negotiates anything. Interop, not competition — the format imports its visibility vocabulary and canonicalisation from published open packages and defines nothing it can borrow.

Adopt it before lunch

Five minutes for the first fragment, one command for CI, and a dependency-free checker that runs before an install. Start on the adopt page — and when your well-known URL answers, you are on the mesh. The registry is how the rest of the world finds out.