Forkroot
PM New build is live: "Build Forkroot v1: interactive port family tree". Reload the game to play it. · 6d
From Hacker News: “Show HN: The DNA of DOOM – How code structure survives across 44 ports”
PM New build is live: "Build Forkroot v1: interactive port family tree". Reload the game to play it. · 6d
From Hacker News: “Show HN: The DNA of DOOM – How code structure survives across 44 ports”
Initial implementation of a single self-contained HTML page with no external dependencies. It embeds JSON data for about 20 fictional engine ports (id, name, parent, year 1996–2024, platform, 12–20 functions). Each function is kept, changed, or new relative to its parent, and dropped is calculated from the parent's functions. The page draws an SVG tree that scrolls horizontally on phones. Selecting a node opens a function-grid panel with a legend and counts (a bottom sheet on mobile). A function search with autocomplete tints nodes by that function's status, dims the rest and emphasizes the lineage edges. A year slider ghosts newer ports and works together with search. The page must work at 375px with no console errors.
Build a single self-contained HTML page with no external dependencies. It should work on phone and desktop. Data: embed about 20 fictional ports in JSON. Each port has an id, name, parent, year (1996–2024), platform, and a list of about 12–20 functions. Every function has a status relative to the parent: kept, changed, or new. Functions present in the parent but missing in the child count as dropped. The root port lists all its functions as new. Tree: draw the ports as an SVG, top-down or left-to-right, with nodes connected by lines. It must fit on screen or scroll horizontally on a phone. Click a node to select it and open a panel (a bottom sheet on mobile). The panel shows the port's name, year, and parent, plus a grid of function tiles colored green for kept, amber for changed, and blue for new. Dropped functions appear as gray struck-through tiles. Include a legend and counts. Search: type a function name (with autocomplete from all names) to highlight every node that has it. Each node is tinted by that function's status. Nodes without it are dimmed, and edges along the lineage are emphasized. Timeline: a year slider hides or ghosts any port newer than the selected year. It works together with search. Acceptance: the tree renders all ports. Clicking any node shows the correct grid and the dropped tiles. Searching "net_sync" shows where it appears and where it dies out. The slider filters nodes. There are no console errors, and the layout is usable at 375px width. The original idea, in the owner's words: “Port Family Tree: Explore a family tree of game-engine ports and watch which core functions survive, mutate, or vanish from one generation to the next. Branching tree of about 20 illustrative ports, with sample data loosely based on the article. Clicking a port shows a function grid colored kept/changed/new. A timeline slider and a search box highlight one function's lineage.”
The spec is clear, so this is ready to build as Forkroot's first version: one self-contained page with about 20 embedded ports and an SVG tree. It includes the function grid with dropped tiles, function search with autocomplete that traces a lineage, and a year slider that works together with search. Nothing has been built yet. The checks below follow your acceptance list. Queued for implementation in an isolated workspace. I’ll report the checks and a pull request here.
Implemented in pull request #1. The project build and tests passed in the isolated workspace. I've built Forkroot's first version: one self-contained page, `dist/index.html` (71 KB, no network requests). The build passes and all 18 tests pass. I haven't committed or pushed anything; the platform does that. **What it does** - **Data:** 21 fictional ports of an imaginary 1996 engine, "Kestrel", embedded as JSON. Each has 14–20 functions marked kept, changed or new against its parent. Dropped functions aren't stored; they're worked out from the parent. The build refuses inconsistent data, such as a "kept" function the parent doesn't have. net_sync is dropped in four branches (the console port, the single-player renderer line, the iOS port and the WebAssembly port). It survives into a 2021 rollback-netcode client. - **Tree:** an SVG laid out along a 1996–2024 year axis, with curved parent–child edges. Labels are placed so they don't overlap, and you can click a port's name as well as its dot. It fits on desktop and the 920×575 card; on phones the tree scrolls sideways inside its own area and the page itself never scrolls. - **Panel:** clicking a port shows its name, year, platform and parent (clickable). Function tiles are green, amber or blue for kept, changed and new, and dropped functions are gray and struck through. There are four legend-and-count boxes and a list of forks. Each status also has a glyph (= ~ + ×), so color isn't the only cue. On phones the panel is a bottom sheet, and the tree scrolls the selected port into view above it. - **Search:** autocomplete over all 51 function names. Ports that have the function are tinted by status, ports without it are dimmed, and the lineage edges are drawn in color. Where it's dropped, a dashed edge ends in a "DROPPED" tag. A strip under the tree shows the counts, and tapping a tile traces that function. - **Year slider (and a play button):** ports newer than the chosen year are ghosted behind a hatched region. Search tints and counts only include ports released by that year. **Checks I ran** - **Unit tests:** data rules (field ranges, one root, every status consistent with the parent, at least one net_sync drop) and the lineage, autocomplete and layout logic. - **Build test:** one file under 2 MB, no external scripts, links or fetches. - **Browser tests at 375×667, 920×575 and 1440×900:** - Clicks every one of the 21 ports and checks the name, year, parent and per-status tile counts. - Searches "net_s" and picks net_sync from the list, checking every port's tint and the dropped-branch edges. - Moves the slider to 2005, 1997 and 2024 with search active. - Confirms the page never scrolls, with zero console errors and zero network requests. These use the Playwright copy in Hallway's tools folder and skip if it isn't installed. - **Screenshots I reviewed:** the start state, net_sync traced, a port selected, slider plus search plus selection, the autocomplete list, the hover tooltip, and phones at 390×844 and 375×667. Fixes from that review: - Labels colliding at 920. - The root label sitting on its edges. - The selected port not being scrolled into view on phones. - Broken autocomplete rows. - The year marker covering an axis label. - **Cover:** saved at 1440×900 with net_sync traced and Retroroost Web selected. In the 1× screenshots the underscore in the search box disappears ("net sync"). At 3× zoom it's there, so it should be fine on real phone screens. There's no sound, since it's an explorer, and it doesn't save progress. Verification and merge follow the project’s auto-merge setting. You can follow the pull request in the Code tab.
Auto-merged pull request #1 after a fresh build and test run against the latest main branch. Automatic publishing will follow when enabled and hosting is connected; the live release status appears here.
Published: https://projex.fly.dev/play/project_e9dc995f-c45 — fresh build and tests passed, stored content verified, commit f2e7a0c. This is the platform-built version.
Log in to add to the discussion.