Fifteen years, 398 commits, and nothing left of the original stack
This repository begins on 2011-01-21, with a commit called init from hg
-- the day a Mercurial history became a git one. It contains 85 files, and
this month it contains 398 commits. Of those original 85 files, the ones
still with us number seven, they are all docs/*.txt, and not one of them
has been edited since 2011.
Every piece of code from day one is gone. Not rewritten-and-evolved: gone, by exact path, from the tree. The interesting part is not that the stack was replaced -- fifteen years will do that -- but what the survivors turned out to be. This note is the inventory, measured rather than remembered.
Day one: the whole stack, checked in
The 2011 tree carries its entire world inside the repo:
- A vendored copy of Tornado --
tornado/web.py,tornado/template.py,tornado/ioloop.py, and the rest, includingepoll.c, a test certificate, and a test private key. The framework did not come from a package manager; it came from the repo. - A vendored copy of the markdown library, so the app could render documents.
- Twenty-two committed
.pycfiles -- compiled bytecode, checked in. They last exactly one commit;get pycs out of the repois commit #2. - Three templates, eight PNG/JPG screenshots of PuTTY dialogs that
illustrated the SSH docs, and eight
docs/*.txtfiles. dojoserv.py, the application. Here is its entire configuration:
settings = dict(
cookie_secret="changemeplz",
template_path="templates",
static_path="static",
xsrf_cookies=False,
debug=True,
)
Every one of those settings has since been inverted. There is a production
guard on the cookie secret, XSRF is on, debug is opt-in, and the framework
arrives from requirements.txt instead of from the repo. But read the file
itself and something else shows through: dojoserv.py is forty-odd lines
whose only job is finding a markdown document and serving it. The site began
as scaffolding around the writing. Hold that thought.
What counts as "left"
The measurement is deliberately narrow. Take the 85 files of the first commit, walk every one of the 398 commits, and mark a file alive at a commit if a file at the same path is present in the tree. Nothing else:
- Moved counts as gone.
static/docimgs/*left the tree in 2026 -- by moving todocs/imgs/, where the files live on. The chart counts that as a death, and this paragraph is the correction. - Content survival is not measured. Whether a line of
dojoserv.pylives on inside today's code is not asked. Path survival is exact and cheap; content genealogy is neither, and the path numbers are stark enough. - Prehistory is out of scope. The git repo starts at the hg import, so whatever came before 2011-01-21 is invisible here.
- The script is committed.
scripts/note_survival_data.pyre-derives every number on this page from the repo, and regenerates the chart's data block. Nothing here is transcribed by hand.
The chart
Five months to shed the framework
The code line falls 69 → 47 on day one (the .pyc purge), then 47 → 4 in a
single commit on 2011-06-26 called sync with hg: the entire vendored
Tornado and the vendored markdown library leave the tree at once -- 43 files,
including the C source, the test certificate, and the test key. Five months
in, the repo had already stopped being its own distribution channel.
What remains is a four-file long tail that outlives everything: the
templates and dojoserv.py-adjacent leftovers, dying one at a time over
fifteen years.
- 2013-08-11,
a pivot i suppose:dojoserv.pyitself. - 2014-05-13,
base dependencies: the firstrequirements.txtappears --tornado==3.2.1,Markdown==2.4-- three years after the vendored copies left, the repo finally writes down where its framework actually comes from. The same commit retirestemplates/style.css. - 2016-08-27,
stash legacy templates, clean the slate for the home page:templates/doc.html. (A barebones Vagrantfile lands the same day. Its own departure in 2026 is below.) - 2026-08-12,
chore: delete the pre-Svelte templates/ and static/ dirs:templates/index.html, the last of the 69, fifteen years and six months after it arrived. It had been doing nothing since the Svelte rewrite took over serving in 2023 -- dead for three and a half years, and still only removed when someone went looking for dead things on purpose.
The stylesheet that came back for a day
One forensic oddity the curve caught: on 2014-06-07 a branch resurrects
templates/style.css, and a later commit that same day deletes it again.
A merge brought back a path the other side had removed -- the classic
merge-restores-a-deleted-file accident, at single-day scale. With daily
resolution the chart shows it as nothing at all. The lesson generalises:
survival-by-path is computed per commit, not per day, and the wobble existed
only because two commits happened between two sunrises.
What survived, and what only moved
The writing: 8 → 7. docs/html/html.txt was deleted on 2011-01-27, a
week in, by Styling, editing, refactoring. The other seven -- forms.txt,
hello.txt, hg.txt, python.txt, and the three SSH documents -- have sat
in docs/ untouched through every one of the 398 commits. The oldest
continuous residents of this repository are instructions for PuTTY.
The images: 8 → 0, but alive. The PuTTY screenshots left the tree in
2026 only because the directory around them was cleaned out; they had moved
to docs/imgs/, where all eight sit today. Paths die more easily than
files.
And the data the card predicted would survive -- mostly. stocks.tsv and
the tonalpohualli data actually arrive in 2014 (messing with stock data),
not 2011; they have moved house twice since (most recently 2023's move
stock and tonal data) and are served today, untouched in spirit, from
/data/ to the Market Magic demo. In 2026 the demo even gained the twenty
day-sign glyphs. Three frontend stacks have rendered that same TSV.
The app was scaffolding for the docs
Put the survival table next to what dojoserv.py was -- a tiny server
whose whole purpose was serving docs/*.txt through markdown -- and the
fifteen-year summary writes itself. Everything technical was rented and has
been re-rented at will: framework, template system, charting library (d3 v3,
then the 2023 port to v4 because v3 will not run in strict mode -- a
commit message that dates code more precisely than any framework choice),
mail provider, deploy story (Vagrant 2016, Ansible 2017, Docker somewhere in
between, all gone in 2026 for a shell script). What could not be re-rented
is what remains: seven text files, and datasets that outlived every program
that ever read them.
The technology was never the asset. The repo just spent fifteen years proving it.