The problem. When a website dies, the Wayback Machine often holds a copy. But each file on a page is saved at a different moment, and archive playback quietly mixes them, so you see a page that may never have existed in that form. Tools that restore sites from the archive exist and are built to hand you files. If the site was yours, or you must rely on what it said on a given day, a page that looks complete but mixes in files from another day is worse than an honest gap.
What Revenant does. You pick a page and a date. Revenant rebuilds the page from the public archive and tells you, file by file, whether it can be trusted for that day.
- The slab. Choose the stored specimen, or paste the address of a page of your own (live). A month strip shows every month the archive holds a copy of the address, so you can pick a day that exists.
- The autopsy. Completeness (the share of the page's files the archive holds a usable copy of) and Fidelity (the share of those files known or likely to look the same on your day), plus a per-file ledger with a verdict and the reason for it: Proven, Likely, Attested, Uncertain, Anachronism, Missing or Unknown.
- The resurrection. The page restored two ways over one viewport, with a divider that sweeps once to show what it does. Left: what a method that trusts capture dates alone can vouch for. Right: what can be shown once the origin server's own dates are used as evidence. Every picture on the restored page is tagged with its verdict and date, and a missing picture is a labelled placeholder, never a broken icon.
- The certificate. A ZIP with each file's capture time, source, digest and verdict, and the commands to check it yourself. The same input gives the same ZIP, byte for byte.
The result that shaped it. On the stored specimen (a retired US federal page, on 2 March 2000) capture dates alone score Fidelity 0%: the archive saved six images two days after that day. The archive also kept the origin server's own Last-Modified header for each file, and those headers say the images last changed on 27 December 1999. Revenant treats that as evidence, labels it as the server's claim, and ignores it when it contradicts what the archive itself saw. With it, Fidelity is 100%, and the same run without it is on screen next to it.
What is real. Runs are labelled SEEDED (saved copies of archive data) or LIVE (the Internet Archive was asked during the run). A lookup that fails is shown as Unknown and kept out of the score, never counted as lost. Revenant also follows stylesheets (@import, url(), <style>, style=""), so images reached only through CSS are found. There is no AI model in the loop: every verdict is a deterministic function of capture times, server dates and content.
Security. The address a visitor types is never fetched; only its host and path are sent as an encoded query to the archive's index. Previews are served with a sandboxing Content-Security-Policy, inside sandbox="" frames, with scripts removed. ZIP paths are validated. Requests, bodies, runs and retained memory are capped. The rate limit reads the client address from the right of X-Forwarded-For by the number of trusted proxies, and this was verified against the real Fly.io proxy.
Limits. One page at a time; links to other pages are flagged, not followed. Scripts are removed, so a Flash-only page restores as its fallback text. No per-client quotas yet. The live run takes from under a minute to a few minutes because the archive is asked one question at a time, on purpose. The app runs on one machine that sleeps when idle, so the first request after a pause takes about two seconds and jobs do not survive a sleep.
The specimen is part of Y2K.gov, a US federal site whose domain no longer resolves. Works of US federal employees are not under copyright, but the authorship of each graphic on the page is not confirmed, and the repository says so (fixtures/snapshots/y2k-briefings/PROVENANCE.md).
Built with Kiro CLI. Specs, steering, hooks and custom agents are in the .kiro/ directory at the repository root; the write-up is KIRO_USAGE.md.
Built With
- axum
- internet-archive
- kiro
- lol-html
- next.js
- react
- rust
- serde
- tokio
- typescript
