60 years of connected documents: the algorithms, the people, and the modern realization of Ted Nelson's xanalogical structure.
In 1960, Theodor Holm Nelson conceived a system where documents would never be copied, links would never break, and every quotation could be traced to its origin. He called it Project Xanadu. He called the literary structure xanalogical — a unique symmetrical connective system with two complementary forms of connection:
Connections between things that are different. Commentary, cross-reference, disagreement. Profuse, bidirectional, unbreakable.
Connections between things that are the same. The same content, visibly and knowably, in more than one place. Not a copy — a live reference.
The World Wide Web, built 30 years later, implemented neither. It gave us fragile one-way links, embedded in flat files, with no recognition of content identity or version change. Nelson's response:
For 40 years, over 100 people worked on Project Xanadu. About 25 were active at the software design level. They produced at least 10 major design iterations, from xu60 (1960) through xu99 (1999). The most complete implementation was Udanax Gold (xu92), released as open source in 1999.
Project Xanadu produced two major working implementations. Udanax Green (xu88, 1988) was the foundational system — a working client-server architecture with the complete data model. Udanax Gold (xu92, 1992) extended it with Drexler's ent system for versioning and reconciliation. Both were released as open source in 1999.
Principally designed and implemented by Roger Gregory and Mark S. Miller. The first complete working implementation of xanalogical structure. Documented in the extensive FEBE (Front End-Back End) Protocol Manual.
Designed by Mark S. Miller, Dean Tribble, and Ravi Pandya, based on K. Eric Drexler's ent data system. Extended Green with built-in versioning and reconciliation.
An enfilade is a tree data structure with two simultaneous properties that seem contradictory:
This dual-property tree was invented by Mark S. Miller, Stuart Greene, and Roger Gregory around 1980 — before either Green or Gold was coded. It was first implemented in Udanax Green (xu88). A single tree serves as both a search index (fast filtering by content fingerprint) and a structural container (impose displacements, transforms, versions).
Figure 1: The enfilade. Flags OR upward for search; structural transforms push downward. A single tree does both.
Why it matters: without enfilades, finding all documents containing a specific content fingerprint requires scanning every document — O(n). With enfilades and canopy propagation, it's O(log n). For a million documents, that's the difference between 1,000,000 operations and 20.
src/edition/canopy.rs (BertCanopy, SensorCanopy). Ported from Gold's C++ to Rust. O(log n) filtering verified by tests.
Tumblers are multi-segment universal addresses for content in a distributed docuverse. Designed by Gregory and Miller for Udanax Green (xu88). They use hierarchical sequences like 4.3.1.7.2 where each segment narrows the location: server, work, edition, span, character.
Tumbler: 4.3.1.7.2
│ │ │ │ └─ character position
│ │ │ └─── span within edition
│ │ └───── edition number
│ └─────── work number
└───────── server number
Tumbler arithmetic supports span operations — unions, intersections, differences — using transfinite arithmetic. This means you can ask "what content overlaps between version 1 and version 3 of this document?" as a pure arithmetic operation on tumblers.
src/space/sequence.rs. Full tumbler implementation with region algebra (union, intersect, minus, complement), prefix queries, and lexicographic ordering.
The ent (designed by K. Eric Drexler, ~1988-92) is a singular enfiladic structure with built-in versioning. It's a tree where every branch represents a version fork, and the tree structure itself encodes the complete version history of a document.
Figure 2: The ent. Versions branch and merge. The tree structure encodes the complete version DAG.
The ent enables non-destructive editing: creating a new version doesn't modify any previous version. It also enables DagWood reconciliation — merging divergent branches by finding the common ancestor and combining non-conflicting changes.
src/ent/ — branch tree (B+tree), content entities, DagWood DAG reconciliation, H-tree (hash tree), trace (position tracking). ~7,000 lines ported from C++.
The backfollow engine answers the question: "Where else does this content appear?" Given a piece of text, it finds all documents containing that text — not by searching, but by content fingerprint matching.
Every piece of content gets a fingerprint (originally a hash, now BLAKE3). The backfollow engine maintains an index mapping fingerprints to all documents containing that content. Query: O(log n) via canopy tree.
src/edition/backfollow.rs (~1,892 lines). Uses BLAKE3 for fingerprinting (Green used a simpler hash). BertCanopy for O(log n) lookup. Recorder/Fossil system for persistent queries.
Canopy trees (BertCanopy and SensorCanopy) are balanced binary indices built on top of enfilades. They enable fast filtering of transclusion queries — instead of scanning every position in every document, the canopy prunes the search space.
| Operation | Without Canopy | With Canopy |
|---|---|---|
| Find content in 1 doc | O(n) scan | O(log n) |
| Find content across 1000 docs | O(1000n) | O(1000 log n) |
| Flag propagation | O(n) rebuild | O(log n) update |
Bert flags track which content fingerprints appear in subtrees. Sensor flags track which positions have specific properties. Both propagate upward (OR of children) enabling pruning: if a subtree doesn't contain the desired flag, skip it entirely.
src/edition/canopy.rs. Full implementation with BertProp/SensorProp flag sets, endorsement bit allocation, and flag-based filtering on transclusion queries. Uses Arc<Mutex> for thread safety (Green was single-threaded).
In the xanalogical model, a document is not a blob of text. It's a list of references pointing to content at permanent addresses. Editing modifies the reference list, never the content itself.
Figure 3: A document is a list of references. Content lives separately at permanent addresses. Transclusions reference other documents.
src/edition/edition.rs — Edition with O-tree entries. src/persist/chunk_store.rs — content-addressed BLAKE3 storage.
DagWood is a DAG-based reconciliation system for merging concurrent edits. When two users edit the same document simultaneously, DagWood finds the common ancestor, compares both branches against it, and automatically merges non-conflicting changes.
This predates operational transform (OT) and CRDTs by decades. The key insight: represent the edit history as a DAG (directed acyclic graph), then find the maximum consistent merge of both branches.
src/edition/three_way.rs (~1,891 lines) and src/ent/dagwood.rs (~1,532 lines). Full three-way merge with conflict detection and position mapping.
The name xudanu combines "xu" (from Xanadu) with "nu" (new). The "nu" represents what modern computer science adds to Nelson's 1960 vision:
Nelson's "central proprietary secret" was "the freezing of content addresses into permanent universal IDs." Gold used simple hashes. We use BLAKE3 — a modern cryptographic hash running at ~1 GB/s, producing 256-bit collision-resistant fingerprints.
| Property | Gold (1990s) | Xudanu (2020s) |
|---|---|---|
| Hash function | Custom hash | BLAKE3 (cryptographic) |
| Speed | ~100 MB/s | ~1 GB/s |
| Collision resistance | Unknown | 2-128 |
| Storage | Flat files | Content-addressed ChunkStore |
Gold tracked content identity (who transcluded what) but had no cryptographic proof of authorship. We add Ed25519 signatures on every text element — each character range is signed by its author's key.
Figure 4: Every character range carries an Ed25519 signature, author identity, and ISO 8601 timestamp. Court-grade non-repudiation.
Gold used grab/release locks — only one user could edit at a time. We replaced this with a CRDT (Conflict-free Replicated Data Type) layered on top of the O-tree. Multiple users edit simultaneously, with automatic convergence.
| Feature | Gold (Locks) | Xudanu (CRDT) |
|---|---|---|
| Concurrent editing | One at a time | Unlimited simultaneous |
| Conflict resolution | Queue + wait | Automatic merge |
| Offline editing | Not possible | Sync on reconnect |
| Real-time awareness | None | Cursors, selections, typing |
Gold's compound spans existed as a side-table alongside the O-tree — two copies that could drift apart. We moved transclusion directly INTO the O-tree as RangeElement::Transclusion — a zero-width element that IS the reference. One store. No drift.
When content is transcluded, the original author's identity and signature follow the content through transclusion chains. If alice writes text in document A, and david transcludes it into document B, document B's attribution panel shows alice as the author — with "via work:A" provenance.
This works recursively through transclusion chains (up to 32 levels), with cycle detection. It's Nelson's golden thread — following authorship back to the ultimate source.
When content is transcluded, the original author's identity and signature follow the content through transclusion chains. If alice writes text in document A, and david transcludes it into document B, document B's attribution panel shows alice as the author — with "via work:A" provenance.
Figure 5: Real attribution panel showing propagation. Alice's content (Jun 24) flows through transclusion into david's document (Jun 26) with original authorship and timestamps preserved.
| Era | System | Key People | Contribution |
|---|---|---|---|
| 1960-65 | xu60/xu65 | Ted Nelson | Hypertext, transclusion, referential editing. The vision. |
| 1970-76 | xu70/xu76 | Nelson, Barus | Enfilades, parallel markup, ring buffers |
| ~1980 | Enfilade theory | Miller, Greene, Gregory | Dual-property tree (search + structure) |
| 1988 | Udanax Green (xu88) | Gregory, Miller | First working system: enfilades, tumblers, content lists, typed links, backfollow, canopy trees, FEBE protocol, span migration |
| 1992 | Udanax Gold (xu92) | Miller, Tribble, Pandya, Drexler | ent system (versioning), DagWood reconciliation, H-tree |
| 1995-99 | Transcopyright, PYXI | Nelson, Yee, Pam | Copyright model, skeleton frontend, open source release |
| 2024-26 | xudanu | Jones, GLM | Rust port, CRDT, crypto attribution, inline transclusion, web frontend |
Nelson's complete vision includes features we have not yet built:
| Feature | Nelson's Concept | Status |
|---|---|---|
| Transpointing windows | Side-by-side docs with connection beams | Filed as #59 |
| Link visualization | Typed links overlaid on documents | Filed as #60 |
| Attestation reports | Court-grade attribution export | Filed as #57 |
| Transcopyright / micropayments | Payment at content delivery | Data model exists, not wired |
| Federation | Cross-server transclusion + links | Transport exists, not complete |
| Rich media transclusion | Video, audio, diagrams | Text only |
The hard part — the algorithms, the data structures, the mathematical foundation — is done. What remains is visualization, infrastructure, and the economic layer. Nelson's team spent 40 years on the hard part. We're building the rest.