Open World Format

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

  1. The world document — what a world is
  2. The package — the folder, assets by hash, integrity
  3. The session log — the ops that build a world, and the history around them
  4. Profiles and extensions — must, may, must-ignore
  5. Versioning policy — the compatibility contract

The JSON Schema is normative; the conformance worlds define correct rendering.

Try it in a minute

npm install openworldformat
import { 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 revision

Status

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.