Notes
2026/04/11
Over the past week I've been experimenting with a hypertext system based on implicit links, where parts of a page are implicitly linked if they share paragraphs.
While I think this could be an interesting hypertext model in general (because you don't need any special link syntax, your paragraphs are your links), I want to experiment with it specifically for non-linear writing and texts with many different versions, where some of the paragraphs might be the same, but some paragraphs differ between versions.
Think of it like a subway map, where two lines (pages) can follow the same route for a few stops (paragraphs), but then diverge, either completely or for a few stops before arriving at the same stop again. There could also be lines that have the exact same route except that one stops at every station while another is an express line that skips stations. In terms of texts, the slow line might be a rough draft, whereas the express line is the final version.
For example, we might start with the following draft:
# A book (draft 1)
This is the beginning of a story.
The hero ventures into the unknown.
There are many trials along the way.
The hero returns changed.
The end.
Now a second draft trims it a bit:
# A book (draft 2)
The hero ventures into the unknown.
There are many trials along the way.
The hero returns changed.
And the final version adds headings:
# A book
## Act 1
The hero ventures into the unknown.
## Act 2
There are many trials along the way.
## Act 3
The hero returns changed.
How can we visualize this structure in a way that lets us read one of the pages while also giving us an immediate intuition for how they are braided together and where they branch off?
It is not enough to just link from each shared paragraph to all the other paragraphs, because then we would just end up with a ton of meaningless links even when different “lines” share most of their route:
# A book (draft 1)
This is the beginning of a story.
The hero ventures into the unknown.
+-------------------------------+
| -> A book (draft 2) |
| -> A book -- Act 1 |
+-------------------------------+
There are many trials along the way.
+-------------------------------+
| -> A book (draft 2) |
| -> A book -- Act 2 |
+-------------------------------+
The hero returns changed.
+-------------------------------+
| -> A book (draft 2) |
| -> A book -- Act 3 |
+-------------------------------+
The end.
# A book (draft 2)
The hero ventures into the unknown.
+-------------------------------+
| -> A book (draft 1) |
| -> A book -- Act 1 |
+-------------------------------+
There are many trials along the way.
+-------------------------------+
| -> A book (draft 1) |
| -> A book -- Act 2 |
+-------------------------------+
The hero returns changed.
+-------------------------------+
| -> A book (draft 1) |
| -> A book -- Act 3 |
+-------------------------------+
# A book
## Act 1
The hero ventures into the unknown.
+-------------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
+-------------------------------+
## Act 2
There are many trials along the way.
+-------------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
+-------------------------------+
## Act 3
The hero returns changed.
+-------------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
+-------------------------------+
This gives us a way to jump back and forth between different versions, but makes it hard to see how they belong together. Can we do better?
What we want to see at a glance is that the two drafts share the core structure (but the first draft has additional stations), whereas the final version is like the second draft but with additional headings.
How do we do that? One option is to stop thinking of links as linking the same blocks together. Instead, we can use links to mark the points where two lines split or join together:
# A book (draft 1)
This is the beginning of a story.
+-------------------------------+
| -> A book (draft 2) |
| -> A book -- Act 1 |
| /-----------------------------+
|/
The hero ventures into the unknown.
|\
| \-----------------------------+
| -> A book -- Act 2 |
| /-----------------------------+
|/
There are many trials along the way.
|\
| \-----------------------------+
| -> A book -- Act 3 |
| /-----------------------------+
|/
The hero returns changed.
|\
| \-----------------------------+
| -> A book (draft 2) |
+-------------------------------+
The end.
# A book (draft 2)
+-------------------------------+
| -> A book (draft 1) |
| -> A book -- Act 1 |
| /-----------------------------+
|/
The hero ventures into the unknown.
|\
| \-----------------------------+
| -> A book -- Act 2 |
| /-----------------------------+
|/
There are many trials along the way.
|\
| \-----------------------------+
| -> A book -- Act 3 |
| /-----------------------------+
|/
The hero returns changed.
|\
| \-----------------------------+
| -> A book (draft 1) |
+-------------------------------+
# A book
## Act 1
+-------------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
| /-----------------------------+
|/
The hero ventures into the unknown.
|\
| \-----------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
+-------------------------------+
## Act 2
+-------------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
| /-----------------------------+
|/
There are many trials along the way.
|\
| \-----------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
+-------------------------------+
## Act 3
+-------------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
| /-----------------------------+
|/
The hero returns changed.
|\
| \-----------------------------+
| -> A book (draft 1) |
| -> A book (draft 2) |
+-------------------------------+
Just by looking at one page (and without having to follow any of the links), we immediately learn a lot more about the structure of the other linked pages. The drawback is that this form of linking is pretty verbose, because we end up with multiple links to the same part of a page.
What if we instead stick to the idea of linking between all shared paragraphs, but mark links differently based on whether they are just regular shared “stations” (where going from line to line wouldn't make a difference) or “transfer hubs” (where switching from line to line lets you go somewhere different)?
Let's add [...] before or after a link text depending on whether the other page has different text before or after the shared paragraph (or both).
We could then rank links in the following order:
Let's draw the last category outside the box used by the other links. We might perhaps want to provide links to paragraphs with the same text before and after as a convenient way to jump to that part in the other document, but since they are much less useful than the other links, we can gray out these same-paragraphs-before-and-after links (or potentially even drop them completely), giving us our final result:
# A book (draft 1)
This is the beginning of a story.
The hero ventures into the unknown.
+--------------------------------+
| -> [...] A book -- Act 1 [...] |
| -> [...] A book (draft 2) |
+--------------------------------+
There are many trials along the way.
+--------------------------------+
| -> [...] A book -- Act 2 [...] |
+--------------------------------+
-> A book (draft 2)
The hero returns changed.
+--------------------------------+
| -> [...] A book -- Act 3 [...] |
| -> A book (draft 2) [...] |
+--------------------------------+
The end.
# A book (draft 2)
The hero ventures into the unknown.
+--------------------------------+
| -> [...] A book -- Act 1 [...] |
| -> [...] A book (draft 1) |
+--------------------------------+
There are many trials along the way.
+--------------------------------+
| -> [...] A book -- Act 2 [...] |
+--------------------------------+
-> A book (draft 1)
The hero returns changed.
+--------------------------------+
| -> [...] A book -- Act 3 [...] |
| -> A book (draft 1) [...] |
+--------------------------------+
# A book
## Act 1
The hero ventures into the unknown.
+---------------------------------+
| -> [...] A book (draft 1) [...] |
| -> [...] A book (draft 2) [...] |
+---------------------------------+
## Act 2
There are many trials along the way.
+---------------------------------+
| -> [...] A book (draft 1) [...] |
| -> [...] A book (draft 2) [...] |
+---------------------------------+
## Act 3
The hero returns changed.
+---------------------------------+
| -> [...] A book (draft 1) [...] |
| -> [...] A book (draft 2) [...] |
+---------------------------------+
As succinct as the first version, but conveys considerably more structure.