2 min read
The whole site is one thread, from the first sketch to the form at the bottom of the page. A visit is one too: the pages you opened, in order, and how long each held the screen. Until now that thread existed only in your head. Now the contact form draws it, on the same hairline and beads as the menu, with a lit bead for the page you are writing on.

Kept in the tab
The record lives in session storage: one list per tab, gone when the tab closes, never in a cookie and never on our server. A page adds a stop when it opens and adds its visible time every few seconds, so a tab left in the background does not count as reading.
// on every page: a stop, and the time it is actually on screen
const t = readTrail();
if (t[t.length - 1]?.path !== pathname)
t.push({ path: pathname, title: "", ms: 0 });
writeTrail(t); // sessionStorage, this tab only
document.addEventListener("visibilitychange", () => {
if (document.visibilityState === "hidden") { flush(); since = 0; }
else since = performance.now();
});Sent only when asked
Under the form there is a box that sends the list with your note, so the person who replies knows whether you read about the boats or only the home page. It is off until you tick it, and the privacy notice says the same.
Its length
The figure beside the label is the scrolling, up and down, at 96 CSS pixels to the inch. Jumps are left out: an anchor link, or a new page starting at its top, moves the page without anyone pulling the thread.
On the page that does not exist, the same thread is drawn with every stop a link, so the way back from a dead end is the way you came.