TMT Fork Census

about · methodology, provenance, how to read the table

A census of the GitHub forks of The Modding Tree and Prestige Tree (both fork lists, plus one level of forks-of-forks). Forks never pushed to are dropped; every other fork's files are read at HEAD and a small lexer counts its layers, tree rows, branch edges and content (milestones, upgrades, buyables, challenges, achievements). Forks with the same layer-id set on the same engine version form one family, represented by one fork; every family with a branching tree and some content is cloned and booted headless (200 idle ticks twice for determinism, plus a simple buy/reset policy), and its engine files are diffed against the closest stock TMT commit of its version (the port cost). Families that are exact copies of a calibration tree are folded into that tree's row. Rows are ranked by a 0–100 composite: branchiness 40, content 30, completeness 30, halved when the boot fails. The data are GitHub metadata and counts, not game code.

Generated 2026-09-15 from data/*.jsonl at commit d3ad5fa. Source, method and raw rows: github.com/PeerInfinity/tmt-fork-census (SUMMARY.md). The play column links the repo's verified live page (stage 4); a greyed marker means the page exists in the repo's metadata but did not answer. The loader column links the same game loaded through tmt-loader (manifests read at commit 17260e0, served from peerinfinity.github.io/tmt-loader/), for every row the loader hosts, live page or not (stage 6). Shaded rows are calibration clones; their copies are listed in the members column. Click a header to sort; drag a header's right edge to resize it (double-click that edge to reset); the table scrolls sideways inside its own frame.

AI disclosure. The census scripts, the documentation and this page were AI-generated (Claude Code sessions directed by PeerInfinity, who set the questions and reviewed the output); every number here is produced by those scripts from the GitHub API and the forks' own source files, and can be regenerated from the repo.

Columns

rank
Rank — Position in this table, highest composite score first. 1–N over the ranked rows; calibration clones are ranked alongside the forks
full_name
Repository — The GitHub repo this row stands for — a family's representative fork, or a local calibration clone. owner/name, linking to github.com; a calibration row links to its upstream repo
play
Play — The row's live game page, derived from the repo's homepage or its GitHub Pages URL and verified with one GET (stage 4). ▶ play = answered 2xx/3xx; a greyed ▶ dead names the status in its tooltip; empty = no URL could be derived
loader
Loader — The same game loaded through tmt-loader on its own engine (no CDN, namespaced save; automation only with ?automation=1) — for every ranked row the loader hosts at the pinned commit (stage 6). ▶ loader = a URL; empty = not hosted
mod_name
Game name — The game's own title, read from modInfo.name in js/mod.js. text, exactly as the fork wrote it
version_num
Version — The game's own version string, from modInfo.versionNumber. text; the stock demo's "0.0" earns no completeness point
base
Base game — The calibration tree this game is built on: its layer-id set contains that tree's, so it is that game plus added or changed content (README, Family collapse (c)). PTR, TMT or upgrade-land-tmt; empty when it is not built on one
tmtNum
Engine version — The Modding Tree engine the fork runs, from tmtNum in js/game.js — or, when the engine was moved off the stock paths, from the engine located by content. e.g. 2.6.6.2; empty when nothing declares it
score
Score — The composite ranking, branchiness 40 + content 30 + completeness 30, halved when the boot failed (lib/score.mjs: composite). 0–100, two decimals
s_branch
Branchiness — The branchiness part of the score: 40 × min(1, (fork nodes + join nodes) / 30), × 0.25 when the tree is linear. 0–40; the /30 is PTR's 30 nodes
s_content
Content score — The content part of the score: 30 × min(1, log10(1 + content) / log10(401)). 0–30; the 401 is PTR's content of 398
s_complete
Completeness — The completeness part: 10 for an endgame differing from the stock demo's, 10 × recency of the last push (≤ 1 year → 1, falling to 0 at 5), 5 for a version that is not 0.0, 5 for booting headless (2.5 not booted, 0 failed). 0–30
layers
Layers — How many game layers the tree has — from the live layers object where the fork booted, else stage 2's static lexer. count
rows
Tree rows — How many distinct rows the tree layout declares — how deep the tree is. count
widthPerRow
Width per row — How many layers sit in each tree row, top row first — the tree's shape in one line. comma-separated counts, one per row
branchEdges
Branch edges — Edges in the branch DAG: every layer-to-layer prerequisite link the tree declares. count
forkNodes
Fork nodes — Layers with ≥ 2 children in the branch DAG — where the tree splits. count; fork + join nodes drive the branchiness score
joinNodes
Join nodes — Layers with ≥ 2 parents in the branch DAG — where branches merge. count; fork + join nodes drive the branchiness score
milestones
Milestones — Milestones counted across the game's layers (boot-exact where the fork booted, else the static census). count
upgrades
Upgrades — Upgrades counted across the game's layers. count
buyables
Buyables — Buyables counted across the game's layers. count
challenges
Challenges — Challenges counted across the game's layers. count
achievements
Achievements — Achievements counted across the game's layers. count
content
Content total — Total content = milestones + upgrades + buyables + challenges + achievements. count; this is what the content score reads
pushed_at
Last push — When the repository was last pushed to, from the GitHub API. YYYY-MM-DD; drives the recency half of completeness
archived
Archived — Whether GitHub marks the repository archived — shown, never scored, since a finished game and an abandoned one both get archived. true / false
stars
Stars — The repository's stargazer count from the GitHub API. integer; used only to break ties when picking a family's representative
members
Members / copies — For a fork row, how many repos share this game (the same layer-id set on the same engine version); for a calibration row, how many forks are exact copies of it and have left the ranking (README, Family collapse). count; the cell expands to the list
boot_ok
Boots — Whether the game loaded and ran 200 headless ticks in its own engine (stage 3). true / false; empty when the family was not booted, and a false halves the score
deterministic
Deterministic — Whether the two idle boot legs ended on the same state hash after the same number of ticks. true / false; a false row lists the differing player paths in SUMMARY.md
policy_ok
Policy leg — Whether the second boot leg survived a generic play policy (each tick: reset any row-0 layer that can reset, buy every affordable unlocked upgrade). true / false; recorded, never scored
trace_fields
Milestone fields — How many distinct player fields the milestone done() conditions read, traced through a Proxy — a rough measure of what the game's goals depend on. count
dev_added
Engine lines added — Engine lines added against the closest stock TMT commit of the fork's version — the port cost. git diff --numstat line count over the stock engine files
dev_removed
Engine lines removed — Engine lines removed against that same stock commit; a stock file with no counterpart in the fork counts as wholly removed. git diff --numstat line count
dev_logic_added
Logic lines added — The share of the added lines that lands in the logic files (game.js, utils.js, utils/*, technical/temp, layerSupport, displays, loader). line count, a subset of engine lines added
dev_logic_removed
Logic lines removed — The share of the removed lines that lands in those same logic files. line count, a subset of engine lines removed
dev_stock
Stock baseline — Which stock TMT commit the engine deviation was measured against (many commits share one tmtNum, so it is the closest of them). version@commit; "(nearest lower)" when the fork's version is not in the stock map
engine_moved
Engine moved — Whether the fork moved its engine files off the stock paths, so they had to be located by content before diffing. true / false
same_tree_as_ptr
Same tree as PTR — Whether the booted game's live row roster is exactly Prestige Tree Rewritten's — flagged so a near-copy is not read as a new game. true / false
license
License — The license GitHub detected on the repository at census time — its license.spdx_id, quoted as reported and not a legal determination; "none" means GitHub detected no LICENSE file, which does not free the code, since a fork of an MIT project without the file is still bound by the upstream terms. SPDX id, e.g. MIT; NOASSERTION = a license file licensee could not match (the TMT lineage's MIT text carries a non-standard copyright line, so nearly every row reads this); calibration rows are read from their clone's own files
Columns