how the exhibits got here
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.
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.
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.
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)) // → []
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.