One file. It is the whole of what you publish.
{
"manifestVersion": 1,
"key": "book_swap",
"name": "Book Swap",
"developer": "Your Name",
"surface": "flat",
"firstParty": false,
"capabilities": ["storage", "hex_context"],
"placement": { "publicHex": false, "ownerOnly": false, "businessOnly": false },
"content": { "schemaVersion": 1 }
}
| Field | Rule |
|---|---|
manifestVersion | Exactly 1. An unknown version is refused rather than guessed at. |
key | Lower snake case, 3–32 characters, starting with a letter. Unique across all publishers. |
name | 1–40 characters, what users see. |
developer | 1–60 characters. Display only — your real publisher identity comes from your account. |
surface | flat or ar_native. |
firstParty | Always false for you. A submission is never first-party, whatever it claims. |
capabilities | An array from the list below. No duplicates. Unknown values are an error, never dropped. |
placement | Three booleans, all required. See below. |
content.schemaVersion | Exactly 1. |
Declare the least you need. Each one is shown to the user in these words before they agree.
| Capability | Shown to the user as | What it gives you |
|---|---|---|
identity | Your identity | Who the viewer is, and how strongly their presence was verified. |
presence | Your presence | Whether the viewer is physically at this hex right now. |
hex_context | This hex’s context | The hex the tile lives in: its owner, category and community. |
storage | Its own content | Read and write this tile’s own content. Nothing else’s. |
social | Your friend graph | The viewer’s friends. |
ar | AR surfaces (later) | Reserved. Declaring it today is an error, because it would be granted nothing at runtime — you would be claiming a power you will never have. |
| Gate | Meaning |
|---|---|
ownerOnly | Only the person who holds the hex may add it. Use this for anything that speaks as the owner. |
publicHex | It belongs on a community Public Hex rather than a personal one. |
businessOnly | It requires a hex with an active Business Upgrade. Advertising lives here. |
businessOnly and publicHex together is an error. A
Public Hex is never business-upgraded, so the pair describes a tile that no hex could ever
satisfy. It would be accepted and then simply never appear, with nothing to explain why, so it
is refused up front instead.
No renderer, no component, no code path, no styling. A manifest never names a component, because
the component is ours. It also carries no permission wording of its own: the disclosure text
above is fixed, so an app cannot describe storage as something friendlier than it is.