~ $ cd projects/architecture && cat README.md

How this site is built

The code of this site is written by an AI — Claude, in Claude Code — from what I ask of it. I say what the site is and how it should be made; it writes the program, and the tests.

The picture is that program. Every ball is a file, every box a folder of the frame or a feature, and every arrow a box that needs another. It is read from the source by the TypeScript compiler, at every commit that changed it. Play it and watch it grow; tangle it to see the same files with nobody saying where anything goes, and untangle it again. Put the tests in, and every file with something in it to run that no test imports directly is drawn as a ring. Point at a file, and its own arrows come out: what it needs, and what needs it.

srcfeaturesplatformfeatures/adventure → platform/browser: 1features/adventure → platform/markdown: 2features/adventure → platform/plugin: 2features/air-quality → platform/browser: 2features/air-quality → platform/charts: 1features/air-quality → platform/data: 3features/air-quality → platform/plugin: 2features/allFeatures.ts → features/adventure: 1features/allFeatures.ts → features/air-quality: 1features/allFeatures.ts → features/architecture: 1features/allFeatures.ts → features/developer-meetings: 1features/allFeatures.ts → features/fibergochi: 1features/allFeatures.ts → features/first-network: 1features/allFeatures.ts → features/fish-market: 1features/allFeatures.ts → features/headline: 1features/allFeatures.ts → features/lagoon: 1features/allFeatures.ts → features/maze: 1features/allFeatures.ts → features/next-word: 1features/allFeatures.ts → features/packages: 1features/allFeatures.ts → features/portfolio: 1features/allFeatures.ts → features/post-tests: 1features/allFeatures.ts → features/rocket: 1features/allFeatures.ts → features/sky: 1features/allFeatures.ts → features/technical-debt: 1features/allFeatures.ts → features/theme: 1features/allFeatures.ts → features/thesis-results: 1features/allFeatures.ts → features/weather: 1features/allFeatures.ts → features/world: 1features/allFeatures.ts → platform/plugin: 1features/architecture → platform/browser: 2features/architecture → platform/markdown: 2features/architecture → platform/plugin: 2features/developer-meetings → platform/browser: 2features/developer-meetings → platform/charts: 1features/developer-meetings → platform/plugin: 1features/fibergochi → platform/browser: 2features/fibergochi → platform/markdown: 1features/fibergochi → platform/plugin: 2features/first-network → platform/browser: 1features/first-network → platform/markdown: 1features/first-network → platform/plugin: 2features/first-network → platform/random: 2features/fish-market → platform/browser: 1features/fish-market → platform/markdown: 1features/fish-market → platform/plugin: 2features/fish-market → platform/random: 1features/headline → platform/plugin: 1features/lagoon → platform/browser: 1features/lagoon → platform/markdown: 1features/lagoon → platform/plugin: 2features/maze → platform/browser: 1features/maze → platform/plugin: 2features/next-word → platform/browser: 1features/next-word → platform/markdown: 1features/next-word → platform/plugin: 3features/packages → platform/browser: 1features/packages → platform/data: 2features/packages → platform/plugin: 2features/portfolio → platform/plugin: 1features/post-tests → platform/browser: 1features/post-tests → platform/markdown: 2features/post-tests → platform/plugin: 2features/rocket → platform/browser: 4features/rocket → platform/plugin: 2features/rocket → platform/program: 4features/sky → features/world: 2features/sky → platform/plugin: 1features/technical-debt → platform/charts: 2features/technical-debt → platform/plugin: 1features/technical-debt → platform/program: 2features/theme → platform/plugin: 1features/theme → platform/shell: 2features/thesis-results → platform/plugin: 1features/weather → platform/browser: 2features/weather → platform/charts: 2features/weather → platform/data: 3features/weather → platform/plugin: 2features/world → platform/browser: 3features/world → platform/plugin: 2features/world → platform/random: 1main.ts → features/allFeatures.ts: 1main.ts → platform/browser: 8main.ts → platform/flags: 2main.ts → platform/plugin: 1main.ts → platform/shell: 1platform/browser → platform/content: 6platform/browser → platform/data: 1platform/browser → platform/flags: 1platform/browser → platform/page: 4platform/browser → platform/plugin: 3platform/browser → platform/program: 12platform/browser → platform/shell: 10platform/data → platform/markdown: 1platform/flags → platform/markdown: 1platform/flags → platform/shell: 2platform/page → platform/content: 7platform/page → platform/markdown: 4platform/page → platform/shell: 2platform/plugin → platform/content: 2platform/plugin → platform/data: 1platform/plugin → platform/flags: 1platform/plugin → platform/program: 4platform/plugin → platform/shell: 2platform/program → platform/shell: 1platform/shell → platform/content: 4platform/shell → platform/markdown: 5mainallFeaturesskyadventureair-qualityarchitecturedeveloper-meetingsfibergochifirst-networkfish-marketheadlinelagoonmazenext-wordpackagesportfoliopost-testsrockettechnical-debtthemethesis-resultsweatherworldbrowserpluginflagspageprogramdatashellmarkdowncontentchartsrandommain.tsfeatures/allFeatures.tsfeatures/sky/browser/followTurning.tsfeatures/sky/browser/Starfield.tsfeatures/sky/skyFeature.tsfeatures/adventure/ADVENTURE_ICONS.tsfeatures/adventure/Adventure.tsfeatures/adventure/adventureFeature.tsfeatures/adventure/adventureStill.tsfeatures/adventure/browser/mountAdventure.tsfeatures/adventure/Charted.tsfeatures/adventure/englishWorld.tsfeatures/adventure/LIFE.tsfeatures/adventure/originalWorld.tsfeatures/adventure/pixelIcon.tsfeatures/adventure/renderAdventure.tsfeatures/adventure/renderMap.tsfeatures/adventure/renderSeen.tsfeatures/adventure/World.tsfeatures/air-quality/airQualityFeature.tsfeatures/air-quality/aStation.tsfeatures/air-quality/browser/mountNo2.tsfeatures/air-quality/flatSums.tsfeatures/air-quality/no2AnnualMeans.tsfeatures/air-quality/no2Colour.tsfeatures/air-quality/no2Grid.tsfeatures/air-quality/no2ScaleTop.tsfeatures/air-quality/No2Selection.tsfeatures/air-quality/no2Source.tsfeatures/air-quality/No2Station.tsfeatures/air-quality/no2Stations.tsfeatures/air-quality/no2Still.tsfeatures/air-quality/renderNo2Figure.tsfeatures/air-quality/renderNo2Heatmap.tsfeatures/air-quality/renderNo2Years.tsfeatures/air-quality/tallies.tsfeatures/air-quality/wholeRecord.tsfeatures/architecture/architectureFeature.tsfeatures/architecture/architectureStill.tsfeatures/architecture/Body.tsfeatures/architecture/boxCycles.tsfeatures/architecture/boxOf.tsfeatures/architecture/browser/ArchitectureScene.tsfeatures/architecture/browser/mountArchitecture.tsfeatures/architecture/Coverage.tsfeatures/architecture/coverageOf.tsfeatures/architecture/decodeHistory.tsfeatures/architecture/encodeHistory.tsfeatures/architecture/graphOf.tsfeatures/architecture/History.tsfeatures/architecture/importsOf.tsfeatures/architecture/Layout.tsfeatures/architecture/layoutArchitecture.tsfeatures/architecture/Metrics.tsfeatures/architecture/metricsOf.tsfeatures/architecture/onlyTypes.tsfeatures/architecture/reachedByTests.tsfeatures/architecture/readGraph.tsfeatures/architecture/readSources.tsfeatures/architecture/renderArchitectureCaption.tsfeatures/architecture/renderArchitectureFigure.tsfeatures/architecture/renderArchitectureSvg.tsfeatures/architecture/renderMetricsSparks.tsfeatures/architecture/Snapshot.tsfeatures/architecture/SourceGraph.tsfeatures/architecture/springTowards.tsfeatures/architecture/tangleStep.tsfeatures/architecture/valueExportsOf.tsfeatures/developer-meetings/browser/heatGrid.tsfeatures/developer-meetings/browser/mountDeveloperMeetings.tsfeatures/developer-meetings/developerMeetingsFeature.tsfeatures/developer-meetings/featureSizeScale.tsfeatures/developer-meetings/simulateMeetings.tsfeatures/developer-meetings/summariseMeetings.tsfeatures/developer-meetings/WORK_WEEK.tsfeatures/fibergochi/browser/mountFibergochi.tsfeatures/fibergochi/Fibergochi.tsfeatures/fibergochi/fibergochiFeature.tsfeatures/fibergochi/FibergochiState.tsfeatures/fibergochi/fibergochiStill.tsfeatures/fibergochi/ODDS.tsfeatures/fibergochi/readKept.tsfeatures/fibergochi/renderFibergochi.tsfeatures/fibergochi/Sprite.tsfeatures/first-network/browser/mountLetters.tsfeatures/first-network/firstNetworkFeature.tsfeatures/first-network/firstReader.tsfeatures/first-network/glyphs.tsfeatures/first-network/LetterReader.tsfeatures/first-network/lettersStill.tsfeatures/first-network/Network.tsfeatures/first-network/readOwnShapes.tsfeatures/first-network/renderLetters.tsfeatures/first-network/Shape.tsfeatures/first-network/shapeProblem.tsfeatures/fish-market/Bidder.tsfeatures/fish-market/browser/mountFishMarket.tsfeatures/fish-market/DutchAuction.tsfeatures/fish-market/fishMarketFeature.tsfeatures/fish-market/fishMarketStill.tsfeatures/fish-market/fixedMargin.tsfeatures/fish-market/Lot.tsfeatures/fish-market/Market.tsfeatures/fish-market/marketMargin.tsfeatures/fish-market/openAuction.tsfeatures/fish-market/ownBidder.tsfeatures/fish-market/ownBidderSource.tsfeatures/fish-market/planner.tsfeatures/fish-market/randomLots.tsfeatures/fish-market/renderFishMarket.tsfeatures/fish-market/Sale.tsfeatures/fish-market/Standing.tsfeatures/fish-market/theTable.tsfeatures/fish-market/Turn.tsfeatures/fish-market/vicente.tsfeatures/fish-market/wanda.tsfeatures/headline/browser/mountHeadline.tsfeatures/headline/Headline.tsfeatures/headline/headlineFeature.tsfeatures/headline/headlineRounds.tsfeatures/headline/headlines.tsfeatures/headline/shuffled.tsfeatures/headline/typewriterFrames.tsfeatures/lagoon/alone.tsfeatures/lagoon/browser/mountLagoon.tsfeatures/lagoon/Fisher.tsfeatures/lagoon/lagoonFeature.tsfeatures/lagoon/lagoonStill.tsfeatures/lagoon/ownFisher.tsfeatures/lagoon/ownFisherSource.tsfeatures/lagoon/playRound.tsfeatures/lagoon/renderLagoon.tsfeatures/lagoon/Round.tsfeatures/lagoon/starters.tsfeatures/lagoon/theLagoon.tsfeatures/lagoon/titForTat.tsfeatures/lagoon/Tournament.tsfeatures/lagoon/Week.tsfeatures/maze/browser/mountMaze.tsfeatures/maze/Cell.tsfeatures/maze/describeWay.tsfeatures/maze/FIRST.tsfeatures/maze/growMaze.tsfeatures/maze/JavaRandom.tsfeatures/maze/Maze.tsfeatures/maze/mazeFeature.tsfeatures/maze/mazeStill.tsfeatures/maze/OPEN.tsfeatures/maze/renderMaze.tsfeatures/maze/wayOut.tsfeatures/next-word/browser/mountNextWord.tsfeatures/next-word/closestWord.tsfeatures/next-word/nextWordFeature.tsfeatures/next-word/NextWordModel.tsfeatures/next-word/nextWordStill.tsfeatures/next-word/pickWord.tsfeatures/next-word/renderNextWord.tsfeatures/next-word/sentenceOf.tsfeatures/next-word/smallCorpus.tsfeatures/next-word/withTemperature.tsfeatures/next-word/wordsOf.tsfeatures/packages/browser/mountPackages.tsfeatures/packages/NpmDownloads.tsfeatures/packages/npmPackages.tsfeatures/packages/npmSource.tsfeatures/packages/packageNotes.tsfeatures/packages/packagesFeature.tsfeatures/packages/packagesStill.tsfeatures/packages/renderPackages.tsfeatures/portfolio/portfolioFeature.tsfeatures/post-tests/browser/mountPostTests.tsfeatures/post-tests/compilePost.tsfeatures/post-tests/examplePosts.tsfeatures/post-tests/postTestsFeature.tsfeatures/post-tests/postTestsStill.tsfeatures/post-tests/renderCompiledPost.tsfeatures/rocket/browser/mountRocket.tsfeatures/rocket/browser/mountStarMap.tsfeatures/rocket/destinations.tsfeatures/rocket/firstShip.tsfeatures/rocket/nearStars.tsfeatures/rocket/projectStars.tsfeatures/rocket/renderVoyages.tsfeatures/rocket/rocketFeature.tsfeatures/rocket/rocketProgram.tsfeatures/rocket/saidSpeed.tsfeatures/rocket/saidTime.tsfeatures/rocket/saidTonnes.tsfeatures/rocket/Ship.tsfeatures/rocket/shipOf.tsfeatures/rocket/voyage.tsfeatures/rocket/whereAt.tsfeatures/technical-debt/simulateTechnicalDebt.tsfeatures/technical-debt/technicalDebtFeature.tsfeatures/technical-debt/technicalDebtProgram.tsfeatures/theme/browser/BrowserTheme.tsfeatures/theme/browser/mountThemeToggle.tsfeatures/theme/browser/settleTheme.tsfeatures/theme/Theme.tsfeatures/theme/ThemeChoice.tsfeatures/theme/themeCommand.tsfeatures/theme/themeFeature.tsfeatures/thesis-results/graphMatchingRuns.tsfeatures/thesis-results/machines.tsfeatures/thesis-results/renderRuns.tsfeatures/thesis-results/thesisResultsFeature.tsfeatures/weather/aWeatherStation.tsfeatures/weather/browser/mountWeather.tsfeatures/weather/countDays.tsfeatures/weather/daysPerYear.tsfeatures/weather/firstQuestion.tsfeatures/weather/histogramOf.tsfeatures/weather/questionInWords.tsfeatures/weather/renderDaysCalendar.tsfeatures/weather/renderWeatherFigure.tsfeatures/weather/steadyYear.tsfeatures/weather/twoHalves.tsfeatures/weather/weatherFeature.tsfeatures/weather/weatherPresets.tsfeatures/weather/WeatherQuestion.tsfeatures/weather/weatherSource.tsfeatures/weather/WeatherStation.tsfeatures/weather/weatherStations.tsfeatures/weather/weatherStill.tsfeatures/weather/weatherVariables.tsfeatures/world/acrossFace.tsfeatures/world/browser/favicon.tsfeatures/world/browser/headerWorld.tsfeatures/world/browser/mountHeaderWorld.tsfeatures/world/browser/mountWorlds.tsfeatures/world/browser/spinPlanet.tsfeatures/world/emptyWorld.tsfeatures/world/filters/colourise.tsfeatures/world/filters/fractalise.tsfeatures/world/filters/sea.tsfeatures/world/filters/temperatures.tsfeatures/world/generateWorld.tsfeatures/world/growWorld.tsfeatures/world/icosahedron.tsfeatures/world/latitudeOfVertex.tsfeatures/world/Mesh.tsfeatures/world/meshOf.tsfeatures/world/nearestVga.tsfeatures/world/PIPELINE.tsfeatures/world/positionOf.tsfeatures/world/quantizeToVga.tsfeatures/world/radiusOfFace.tsfeatures/world/renderSphere.tsfeatures/world/SphereOptions.tsfeatures/world/SphereRaster.tsfeatures/world/subdivide.tsfeatures/world/TextCell.tsfeatures/world/textCells.tsfeatures/world/textWorldHtml.tsfeatures/world/turning.tsfeatures/world/vgaPalette.tsfeatures/world/withMesh.tsfeatures/world/World.tsfeatures/world/worldFeature.tsfeatures/world/WorldRecipe.tsplatform/browser/appsOf.tsplatform/browser/askProgram.tsplatform/browser/BrowserFlags.tsplatform/browser/carriedLine.tsplatform/browser/el.tsplatform/browser/ModelContext.tsplatform/browser/modelContextHere.tsplatform/browser/mountApps.tsplatform/browser/mountNavigation.tsplatform/browser/mountProgram.tsplatform/browser/mountTerminal.tsplatform/browser/offerTools.tsplatform/browser/PROGRAM_ASKED.tsplatform/browser/PROGRAM_RAN.tsplatform/browser/siteInBrowser.tsplatform/browser/sourceLineOf.tsplatform/browser/watchOnScreen.tsplatform/plugin/commandsOf.tsplatform/plugin/Feature.tsplatform/plugin/programStill.tsplatform/plugin/Signal.tsplatform/plugin/stillsOf.tsplatform/flags/Flag.tsplatform/flags/flagsCommand.tsplatform/flags/flagsInAddress.tsplatform/flags/FlagStore.tsplatform/page/APPEARANCE.tsplatform/page/bookSchema.tsplatform/page/declaredAppearance.tsplatform/page/fillStills.tsplatform/page/formerAddresses.tsplatform/page/isHere.tsplatform/page/placeholderDisc.tsplatform/page/renderDocument.tsplatform/page/renderMain.tsplatform/page/renderRedirect.tsplatform/program/aProgram.tsplatform/program/ChoiceParameter.tsplatform/program/commandLineOf.tsplatform/program/initialValues.tsplatform/program/inputSchemaOf.tsplatform/program/NumberParameter.tsplatform/program/Parameter.tsplatform/program/Program.tsplatform/program/programCommand.tsplatform/program/ProgramRun.tsplatform/program/readOptions.tsplatform/program/settleValues.tsplatform/program/sliderOf.tsplatform/program/Values.tsplatform/program/wordOf.tsplatform/data/layeredJson.tsplatform/data/missingYears.tsplatform/data/refreshSource.tsplatform/data/renderSourceLine.tsplatform/data/socrataUrl.tsplatform/data/YearlySource.tsplatform/shell/Command.tsplatform/shell/CommandHistory.tsplatform/shell/commands/cat.tsplatform/shell/commands/cd.tsplatform/shell/commands/clear.tsplatform/shell/commands/find.tsplatform/shell/commands/grep.tsplatform/shell/commands/help.tsplatform/shell/commands/ls.tsplatform/shell/commands/pwd.tsplatform/shell/commands/siteCommands.tsplatform/shell/editLine.tsplatform/shell/Outcome.tsplatform/shell/parseCommandLine.tsplatform/shell/plainTextOf.tsplatform/shell/promptPath.tsplatform/shell/resolvePath.tsplatform/shell/Shell.tsplatform/shell/suggest.tsplatform/shell/typedLines.tsplatform/markdown/escapeHtml.tsplatform/markdown/flow/layoutFlow.tsplatform/markdown/flow/parseFlow.tsplatform/markdown/flow/renderFlow.tsplatform/markdown/highlight.tsplatform/markdown/renderBars.tsplatform/markdown/renderInline.tsplatform/markdown/renderMarkdown.tsplatform/markdown/renderMath.tsplatform/markdown/slugOf.tsplatform/content/nameOf.tsplatform/content/Page.tsplatform/content/pageShowing.tsplatform/content/parentOf.tsplatform/content/parseFrontMatter.tsplatform/content/routeOf.tsplatform/content/Site.tsplatform/charts/barChart.tsplatform/charts/CHART.tsplatform/charts/chartFrame.tsplatform/charts/ChartLabels.tsplatform/charts/fixed.tsplatform/charts/lineChart.tsplatform/charts/niceTicks.tsplatform/charts/Series.tsplatform/charts/yearBars.tsplatform/charts/yearFrame.tsplatform/charts/yearLine.tsplatform/random/randomOf.ts
c862b80 27 September 2026 — The sixty-four rooms drawn as rooms: walls where there is no way out, a door that wants a key marked until it is opened, what each room holds now as a picture, the player standing in it, and the life left as hearts. The game's own words and its status line are as it printed them
366 files in 34 boxes, 156 tests · 209 arrows between boxes, 325 of all 802 onto a type · a test reaches 188 of the 316 files with something to test · no boxes in a circle
filesarrows between boxes

The arrows point one way

A rule written in a document is a rule that can be missed, by a person or by an AI. So the rules of this code are not in a document: they are tests it has to pass. architecture.test.ts reads the same graph this picture draws, and fails when

The dashed arrows need only a type: a box that depends on an interface, not on what implements it. That is dependency inversion, and it is what lets a feature be removed by removing its folder.

8 September 2026

On its first day the source was sorted by kind of file: a core and a ui. On the second it was sorted by what the site is — a frame, and the features standing in it — in one commit: The folders say what the site is, not what kind of file each one holds. Drag the slider back to it and watch the files cross.

~/projects/architecture $

~/projects/architecture $