An asset does not need its own market. It needs a unit somebody already holds
rwa/1 — a machine-readable record of a real-world asset, the attestations that stand behind it, and the obligations issued against it. Dependency-free, publishable at your own domain, verifiable by anyone.
Tokenising a real-world asset has meant minting a token and then hunting for a market, which is why almost every RWA token is illiquid — each asset becomes its own market, and a market of one asset has no depth on any day its owner is not selling. `rwa/1` gives an asset a denomination instead: obligations are issued in a unit that already circulates, so a reward against a Chicago office building and one against a Vancouver hotel are the same unit in a holder’s hands. There is no per-asset liquidity to bootstrap because there is no per-asset unit.
`rwa/1` is one JSON file an organisation publishes at `/.well-known/rwa.json`: the assets it holds, the dated attestations behind each one, and the obligations issued against them. No account, no server, no chain — a stranger fetches it and checks it offline, and the validator imports nothing but `node:` builtins so it runs before an install and in a browser.
Five rules, each a refusal rather than a warning: a reward may not be performance-linked; an independent claim (appraisal, audit, custody, title, insurance, environmental, occupancy) may not be made by the issuer; every attestation carries an expiry after the date it is true as of; money and units are integer minor units; and the starter’s own placeholders are rejected.
It is the present tense, and it takes `backlog/1`’s shape rather than `shipped/1`’s — an asset record is a standing description restated as facts change and stale when nobody restates it. For the same reason it is not a `checkpoint/1` leaf source: nothing here is sealed, so there is no digest to commit to.
Installing it puts this command on your path — read from the package’s own manifest, so this list cannot drift from what you actually get.
assetmeshThe validator has no dependencies at all, so nothing about the verdict depends on this estate: `npx assetmesh check` runs the same rules a stranger runs, and `vendor-assetmesh.mjs` runs them with nothing installed. The JSON Schema and the validator are differentialled against each other rather than eyeballed, and the vocabulary it borrows from `directory/1` is compared against the real package by a drift test, because a copy does not break when it drifts — it disagrees, silently, about whichever field somebody has just changed.
Apache-2.0, read from the package’s own manifest. Embed it in anything, including closed software — that is what makes a spec adoptable and a verifier worth running. FlashyOS’s server side is AGPL-3.0-only instead, and a test in the monorepo asserts the direction between them: AGPL code may consume this, this may never consume AGPL code.