Contents
1. Purpose & design goals
Media type: application/vnd.openloom+json · Extension: .openloom (plain JSON also accepted as .json)
OpenLoom is a JSON interchange format for loom trees — branching, multi-author explorations of language-model output. It exists so a tree created in one loom (Aspen Grove, socketteer loom, Loomsidian, MiniLoom, ExoLoom, …) can be opened in another without losing structure, attribution, or provenance.
Design goals, in priority order:
- Lossless for structure. Branching topology — including hypergraph edges, multi-root trees, and edit lineage — survives round-trips.
- Provenance-capable, provenance-optional. The format can carry full cryptographic provenance (content hashes, hash chains, raw API response evidence), but a minimal exporter can omit all of it.
- Readable and writable by small tools. A conforming minimal file is a few dozen lines of obvious JSON. Complexity is opt-in.
- Forward-compatible. Versioned, with explicit rules for unknown fields and a namespaced extension mechanism.
1.1 Lessons from the ecosystem
The format normalizes divergences observed across community looms:
| Concern | Community reality | OpenLoom answer |
|---|---|---|
| Topology encoding | Nested children objects (socketteer), flat map + parent pointer (Loomsidian), flat map + both pointers (MiniLoom) |
Flat node map + explicit edge list (§ 4.4) |
| Multi-root | Faked with immutable empty roots, or unsupported | rootNodeIds array (§ 4.2) |
| Authorship | type: user|gen, meta.source: AI|prompt|mixed, or absent |
author.role enum incl. mixed (§ 4.3) |
| Content | Full text, chat messages, or diff-patches against parent | Content block union; importers materialize diffs (§ 4.3, § 8) |
| Provenance | Rich (socketteer model_responses) to none (Loomsidian) |
Optional generation object (§ 5) |
| UI state | Mixed into data (collapsed/unread/hoisted) | Excluded from core; extensions only (§ 7) |
| Versioning | None anywhere | Required version field (§ 3) |
