A world is one JSON document. Here is the smallest valid, walkable one:
{
"thread": "thread/0.1",
"world": { "id": "myplace", "title": "My Place",
"author": { "id": "did:web:example.com", "name": "You" },
"license": "CC-BY-4.0" },
"spawns": [ { "name": "entry", "position": [0,0,8], "yaw": 3.14159 } ],
"prefabs": [ { "id": "60000001", "mesh": { "builtin": "plane" },
"material": { "base_color": [0.12,0.12,0.16,1.0], "roughness": 0.95 } } ],
"placements": [ { "prefab": "60000001", "name": "floor",
"position": [0,0,0], "scale": [30,1,30] } ],
"portals": [ { "id": "out", "position": [0,1.4,-6], "scale": [2,3,0.2],
"to": "thread://worlds.pixygon.io/wayshrine", "label": "A wayshrine" } ]
}thread MUST be "thread/0.1".builtin (cube/sphere/cylinder/capsule/plane/quad) or asset (a glTF asset).to MUST be a valid thread:// locator — portals are the links that make this a web.presence entirely and your world is a solo place. To let travelers meet, add "presence": { "relays": ["wss://relay.pixygon.io"] } (or run your own relay — the wire format is public).60000001, 60000002, …), specified in Structured Id v0.1.The full grammar: World Manifest v0.1 · Locators & resolution · Presence · Behavior ABI · Passport (identity) · Avatar · Structured Id.
The standalone tier needs nobody's permission: serve your manifest at
https://<your-host>/.well-known/thread/world.json # optionally per-path places: https://<your-host>/.well-known/thread/<path>/world.json
…and thread://<your-host> is a live place. Any conformant browser can walk in. That escape hatch is deliberate — it is what keeps the Thread an open web rather than someone's product.
Conformance is decided by the public suite, not by taste. It is its own tool: install a prebuilt binary if you have no Rust, or take it from crates.io if you do.
# no Rust needed — prebuilt binaries, Linux/macOS/Windows curl -fsSL https://raw.githubusercontent.com/Pixygon/thread-engine/main/install.sh | sh # …or, with a Rust toolchain: cargo install thread-conformance mkdir -p myworlds/myplace && cp /path/to/world.json myworlds/myplace/ thread-conformance myworlds/ # exit 0 = ✓ CONFORMANT thread-conformance --live yourdomain.com # once it is published
The same installer gives you thread, the authoring CLI (also cargo install thread-cli): init, validate, lint, export, model, level, compile, doctor, preview.
And resolve any locator exactly like a browser would:
curl -s "https://api.pixygon.io/v1/thread/resolve?loc=thread://worlds.pixygon.io/wayshrine"
A note on the two tiers: the standalone tier (.well-known on your own host) is permissionless — that is the open standard. The registry tier (worlds hosted at worlds.pixygon.io) is operated by Pixygon, curated, and open for submissions — a paid convenience, never a gate. Build standalone; nothing is locked. A live standalone exemplar you can study: curl https://thread.pixygon.io/.well-known/thread/world.json — this very site is also a place.
Browse them on Places, or read the list as JSON: GET /v1/thread/worlds. Portal into them from your own world — a linked world is a real one; a dangling world is a page nobody links to. When you are ready to change the standard itself, the door is here.