2026

The restoration lab

how the exhibits got here

1 · Digging in the Wayback Machine

The three hand-coded sites died with their hosts; the Internet Archive's Wayback Machine had been quietly photographing them for years. Recovery starts with the CDX API — a catalogue of every capture the archive holds under a URL prefix:

https://web.archive.org/cdx/search/cdx?url=members.fortunecity.com/atakee1*
    &collapse=urlkey&fl=original,timestamp,statuscode&filter=statuscode:200

Files are then fetched raw with the archive's id_ flag, which turns off the Wayback toolbar and link-rewriting and returns the original bytes:

https://web.archive.org/web/20040130074500id_/http://members.fortunecity.com/atakee1/index.htm

A small crawler starts from one anchor capture and follows internal links; for each page the archive serves the capture nearest in time to the anchor, which keeps a whole site era-coherent instead of mixing 2001 pages with 2009 ones. It fetches politely — about one request per second, with backoff, because archive.org drops connections when hammered — and it's resumable.

Field notes: a Turkish “ç” in one filename crashed the crawler and had to be percent-encoded as windows-1254; six template graphics were never archived under the site's own path and were recovered from identical copies in sibling directories of the same server; one page (euro1.htm) was simply never captured, and is gone.

2 · The junk gallery

Free hosting was never free. FortuneCity paid for the disk space by injecting trackers, banner frames and pop-up machinery into every page it served. This — displayed here as inert text, museum-glass style — is what surrounded my homepage in the raw capture, and what was stripped in the restoration (the exhibit keeps every byte I actually wrote):

Specimen · injected by the host, removed 2026

<script language="Javascript">
<!-- hide
document.write('<font size=-3><img src="http://www.fortunecity.com/banners/track1.gif"
  height=1 width=1% border="0" name="FCimg11bnr" hspace=0 vspace=0>');
// -->
</script>

<script language="Javascript" src="http://www.fortunecity.com/js/adscript.global.new.js">
</script>

var GiveMePopups = 1;
DisplayFCAdBanner();

<table id="fcnavbartable2" style="visibility:hidden" ...>
<tr><td><iframe id="fcpopular" src="http://www.fortunecity.com/banners/popular.html"
  width="100%" height="15" ...></iframe></td></tr></table>

A 1×1 tracking pixel, a global ad script, var GiveMePopups = 1 — a variable name with the honesty of its age — and a hidden iframe of “popular” links. Later captures added Google Analytics and ZEDO ad tags on top. All of it is preserved in the repository's first commit, behind glass.

3 · The charset surgery

The one modernization every archived page had to accept: GitHub Pages serves all HTML with a Content-Type: text/html; charset=utf-8 header, and an HTTP header outranks whatever a page's <meta> tag says. The exhibits were written in iso-8859-1, windows-1254 and iso-8859-9 — so every Turkish “ğşıçöü” arrived as mojibake.

The fix: transcode each file to UTF-8, exactly once. Each file's real encoding is detected first (a strict UTF-8 decode as the test — six files turned out to be UTF-8 already, and transcoding them twice would have destroyed them), and only .htm/.html files are touched, never binaries. The original bytes live untouched in git history.

4 · Rescuing the living

The two blogs posed the opposite problem: not digging up the dead, but making the living independent of their landlord. They were crawled directly from Blogger — posts, year and month archives, label pages, the “older posts” pagination chains — then hermetically sealed: fonts, theme graphics and images pulled out of Google's CDNs into local folders, every reference rewritten (including srcset attributes, CSS url() values — some backslash-escaped, some protocol-relative — Open Graph metas and the favicon), every outbound link disarmed to href="#" with the original URL kept in a data-original attribute.

Some post images had already been lost by Blogger's own image proxy while the blogs were live. Their references now point at an intentionally absent local path: still broken — that's authentic — but without dozens of slow, doomed round-trips to Google. Sealing cut the home page's load time roughly tenfold.

The seal is verifiable in your browser console on any blog page:

performance.getEntriesByType('resource')
  .filter(r => !r.name.startsWith(location.origin))   // → []

5 · Verify it yourself

Every intervention is a commit; the untouched originals are always one git checkout away. The load-bearing ones:

The crawlers behind all of this are open source: website-rescue-kit — take them, your old sites might still be rescuable too.

Back to the museum →