Temporal notary — verify

lastseen.dev publishes a daily hash chain over every dated component observation. It lets anyone prove a given observation existed on a given day and was never altered after the fact. This page shows today's chain head and how to re-derive it yourself.

chain head
9982cc4a0251c0083fa668b081307512c340184606104cf60555a006504ed09f
latest block date 2026-09-11  ·  block height 44  ·  genesis 2026-07-22
populations in head slice docker 490, mcp 319, npm 532036, schema 13299
chain format v1  ·  spec v1.0

Verify it yourself — machine or human

The serialization is frozen (spec version 1.0, HASHCHAIN-SPEC.md). To reproduce any block:

  1. Fetch the observations dated D (each population's dated rows).
  2. Build one canonical line per observation:
    {population}|{primary_id}|{observation_date}|{detail_sha256}
    where detail_sha256 = SHA-256 of the canonical JSON (sorted keys, separators (",",":"), NULL → "") of every OTHER column of that row.
  3. Sort the lines bytewise ascending, join with \n (UTF-8, no trailing newline) → slice_bytes; slice_sha256 = SHA-256(slice_bytes).
  4. block = SHA-256(prev_block_hex + ":" + D + ":" + slice_sha256_hex), genesis prev = "0"*64, walking dates in ascending order. The last block is the head above.

Seal policy. Each day's slice is sealed the following day, once complete — the current, still-accumulating day is never sealed. (This is why the head's latest block date is yesterday, not today.) An empty day is not a block — a coverage gap is interval-censored, never a zero slice. The reference implementation (p6/mcp_chain_build.py --verify) does exactly this re-derivation and must reproduce the published head bit-for-bit.

Point-in-time reads

Any read endpoint accepts ?as_of=YYYY-MM-DD and answers with the observation's real date, its source, and a censoring status — never a nearest-value guess. A date before coverage returns not-observed-at-date; a carried-forward value is marked interval-censored.