How content reuse works in Xudanu — what we built, what we're building, and how it connects to the Xanadu lineage
| Feature | Status | Details |
|---|---|---|
| Structural transclusion | Working (FR-37) | Inline RangeElement::Transclusion in the O-tree — single source of truth, no side-table drift; read-only resolution with generation-stamped caches |
| Placement UX | Working | Place transclusions at arbitrary positions; pinned quotations in the placement UI |
| Range-based reference | Working | Stores (source_work_id, char_start, char_end) |
| Recursive resolution | Working | 32-level depth with cycle detection |
| Span migration | Working | Positions update when the source is edited; migration through arbitrary deltas, including inside materialized virtuals |
| Provenance propagation | Working | Original author attribution flows through transclusion chains; attribution splits honestly when passages are edited |
| Derived works | Working (FR-37) | Trails materialize as real derived editions; generation-checked ensure keeps derived content consistent with sources |
| Content hash (BLAKE3) | FR-26 | Hash stored at creation, verified on resolution |
| Version pinning | FR-26 | Source revision recorded, original version retrievable from history |
| Immutable snapshots | FR-26 Phase 3 | Blob store preserves exact content, survives source deletion |
| Cross-server transclusion | Working (FR-6) | Domain-based tumblers; content fetched from remote servers with BLAKE3 verification and Ed25519 TOFU identity |
| Spanfilade | Future | I-stream transclusion — see below |
The largest architectural change since this document was first written: transclusions now live inside the document model itself, as an inline RangeElement::Transclusion element in the O-tree — one source of truth, where the earlier design kept a separate compound side-table (which could drift from the text).
Since v1.1, every new transclusion stores a BLAKE3 content hash alongside the range reference. This means:
Transclusions can chain: Document A transcludes from B, which transcludes from C. Xudanu resolves these chains recursively up to 32 levels deep, with automatic cycle detection.
When a source document is edited, the character positions of transclusions referencing it need to update. Xudanu uses delta-based span migration: the text delta (insert/delete operations) is used to compute new positions for all affected transclusion ranges.
Gold's spanfilade is a fundamentally different model. Instead of referencing character positions, it inserts content at the I-stream level — a layer below character offsets. This means:
ent/ module already has the crum/HTree machinery to support it.
Cross-server transclusion works today (FR-6): a transclusion references a tumbler "server.domain".work_id.revision.start-end, and the content is fetched from the remote server with BLAKE3 hash verification and Ed25519 trust-on-first-use server identity (pinned on first contact, change-detected thereafter). A transclusion from another server renders exactly like a local one, and its provenance chain reaches across the network. See the network guide for the trust model and the adversarial resilience notes for how peer-supplied content is validated at the boundary.
ent/ module has inline citations to specific Gold source files (entx.cxx, dagwoodx.cxx, branchx.cxx). The design decision to use range-based transclusion instead of spanfilade is documented in docs/dev/FR-17-storage-architecture.md.
The key architectural choices:
| Concept | Gold | Xudanu |
|---|---|---|
| Content reference | Enfilade/I-stream position | Character range + BLAKE3 hash |
| Version persistence | Enfilade preserves all versions | Revision history (FR-23) + blob snapshots (FR-26 P3) |
| Provenance | Crum-based | Ed25519 signatures + span provenance |
| Cross-server | Cosmic tumblers + FeBe | DNS-anchored tumblers + XCP/HTTP |
| Live updates | Built into enfilade | O-tree CRDT delta + span migration |
Real screenshots of transclusion in action. These are not mockups.
The source document contains the original text. Any passage can be transcluded into other documents.

Select text in the source document and click the Transclude button. The passage is held in memory.

Navigate to the destination document and click to place the transclusion. The excerpt text appears inline.

The placed transclusion shows its source origin. The derivation chain traces the content back to its original author.

The Connections panel shows all transclusions in the current document — source title, excerpt, and character range.

# Clone and build git clone https://github.com/jonesd/xudanu.git cd xudanu cargo build --features server -p xudanu # Start the server ./target/debug/xudanu-server run 127.0.0.1:8080 # Open http://localhost:5173 # 1. Create a document with some text # 2. Select a passage, click "Transclude" # 3. Create another document # 4. Place the transclusion in the new document # 5. Edit the source — watch the transclusion update live
Xudanu is an independent open-source project (Apache 2.0), not affiliated with Project Xanadu™ or the Udanax team. Transclusion concept © Ted Nelson. Udanax Gold released under X11 license (1999).