An open format for worlds
The scene, the history that built it, and what happened in it — one .world package anyone can read.
A .world is a folder (a zip is its transport form) holding a world
document, a typed state document, an append-only session log, and
content-addressed assets. State at any revision is a pure fold of the
log over the base — which makes rendering, editing, multiplayer, undo,
save games, replays and mods all reads over one history.
It is the layer above glTF, not a competitor: meshes stay glTF
leaves, referenced by content hash. glTF owns transport; .world owns
composition, parametric authoring, behavior, audio, game state and
sessions.
Read the spec
- The world document — what a world is
- The package — the folder, assets by hash, integrity
- The session log — the ops that build a world, and the history around them
- Profiles and extensions — must, may, must-ignore
- Versioning policy — the compatibility contract
The JSON Schema is normative; the conformance worlds define correct rendering.
Try it in a minute
npm install openworldformatimport { parseManifest, parseLogLine, foldLog } from "openworldformat";
const manifest = parseManifest(await fs.readFile("world/manifest.json", "utf8"));
const entries = (await fs.readFile("world/ops.jsonl", "utf8"))
.split("\n").filter(Boolean).map(parseLogLine);
const state = foldLog(manifest, entries); // the world at head revisionStatus
Draft 0.1, describing manifest schema version 3. The schema, the conformance suite and a reference fold implementation are in the repository, tested in CI. Expect churn until 1.0; the versioning policy is the contract.