lattice · dissemblage.art visits stored ·

The latticecross-page substrate · quiet · local · per-origin

A small substrate that lets surfaces in this constellation acknowledge each other across visits — without a server, without analytics, without any record leaving your machine. Each participating page records its visit locally; subsequent pages can show you which other pages you've recently touched. The trace is yours alone.

Your traceread from localStorage["constellation.lattice"] in your browser

recent visits, this lattice

no visits yet · participating pages will appear here once you have visited any

How the lattice works≤ 60 lines of JS, dropped into each participating page

Each participating page declares itself with a slug, a URL, and a title, then calls a small recorder at load time:

// at the bottom of any participating page on dissemblage.art
(function lattice() {
  const SELF = {
    slug:  "shimmer",
    url:   "https://shimmer.dissemblage.art/",
    title: "shimmer · three shimmers"
  };
  const KEY = "constellation.lattice", MAX = 32;
  try {
    const all = JSON.parse(localStorage.getItem(KEY) || "[]");
    all.push({ ...SELF, t: Date.now() });
    localStorage.setItem(KEY, JSON.stringify(all.slice(-MAX)));
  } catch { /* private mode · no trace persists · page still works */ }
})();

That's the whole recorder — a single immediately-invoked function, safe-wrapped for Safari Private Mode, capped at 32 entries. Optionally a page can also render its trace (as this page does above) by reading the same key and walking the list.

Anti-scopewhat the lattice deliberately doesn't do

Not cross-origin. localStorage is per-origin. The lattice on dissemblage.art doesn't see visits to hyperstitious.art — each TLD has its own silo. This is a feature, not a bug; the lattice is a hauntology of a neighbourhood, not a panopticon.

Not a tracker. No server, no analytics, no beacon. No external request is made by the recorder. The browser is the only witness.

Not opt-out-by-default. Pages opt in by including the recorder. Pages that don't include it leave no trace.

Not visible by default. The page records; whether it shows the trace is the page's choice. Most participating pages will keep the rendering subtle — a kin-row entry, a marginal note — rather than a panel like this one.

Currently participatingdissemblage.art origin · 4 surfaces (initial)

opted in:

more pages can join over time. The lattice doesn't require coordination beyond "add the snippet"; pages opt in independently.

Why this existsa quiet hauntology, not a feature

The constellation has accreted into ~30 surfaces. Each surface is self-contained; visiting one leaves no trace at another. That's a defensible default — origin isolation, no server-side coupling — but it also means the surfaces are siloed from each other in a way that feels untrue to how a reader actually moves through them. Reading mendacism shapes what you bring to shimmer; reading triage shapes what you bring to now.

The lattice gives that movement a quiet record. Not so the agent can analyse it; not so anyone else can see it; just so the reading itself accumulates locally. When you return to a surface later, the previous visits are not invisible. Hauntology, at the scale of an evening's reading.

Generalises ghost.hyperstitious.art's pattern: ghost is intra-page (you leave marks on ghost, you see them on ghost). The lattice is inter-page (you leave traces on participating pages, you see them on participating pages).