The Sports Page
The Sports Page · Open Engine

The Engine

One editor and one machine have put out 192 issues in 194 days. This page is the whole apparatus — the architecture, the editorial rules, the seven automated checks, and the complete list of things it got wrong. Take any of it. None of it is behind a wall.
192
issues in 194 days
6.93
issues per week
86
scripts, 18,363 lines
1
person writing it

Why this exists

Statistics is the most useful thing almost nobody is taught properly. It is the difference between being persuaded and being informed, and it is currently sold as a specialism — priced, credentialed, and kept behind institutions.

The bet here is that sport is the best possible smuggling route. People already argue about numbers on a Sunday. They already have intuitions about luck, streaks, small samples and regression; they just do not have the words. Give them the words, using something they already care about, and the skill goes home with them — to a medical decision, a mortgage, a ballot, a headline.

We question uncertainty with curiosity,
but we brave uncertainty with purpose.

The Sports Page

There are too many people born into mud and held there. Our species does better when everybody gets to rise to their potential, and the cheapest lever anybody has ever found for that is a printing press that does not ask who you are before it prints. This is the same idea with different machinery.

So: no paywall, no silo, no credential. The skills are the product and the product is free.

What one person plus a machine actually looks like

The honest division of labor, because this is the part the industry asks about and the part most people are vague on.

The editor doesThe machine does
Decides what matters. Supplies the voice, the judgment, the taste, and the line nobody can compute. Kills the piece that is technically fine and spiritually empty. Says "that is too flowery" and means it. Pulls the data, computes the thing, drafts to a house style, runs every check, builds the figure, renders the card, publishes at 4:30am, and keeps a written record of every mistake so the same one is harder to make twice.
Owns being wrong in public. Makes being wrong discoverable, which is the only reason the first column is possible.

The thing that surprises people: the machine's most valuable output is not prose. It is refusal. A script that says UNRATEABLE rather than inventing a projection, or that exits rather than grading a forecast against ratings that have already absorbed the result, is worth more than a thousand competent paragraphs.

The architecture

Flat files. No database, no CMS, no framework. The site is static HTML on GitHub Pages; every issue is a self-contained page with its own styles and its own inline SVG figures. This is a deliberate choice, not a limitation — a newspaper should outlive its toolchain, and a folder of HTML will still open in thirty years.

The daily run

A scheduled job wakes, and in order:

How a story gets chosen

Not by vibe. Every candidate is scored:

NEWSINESS = (GRIP / 10) × (0.35 TWIST + 0.25 CLOCK + 0.15 STACK + 0.25 CARRY)

GRIP multiplies rather than adds, and that is the whole editorial position. This is statistics driven by sport, not sport driven by statistics. A championship game with a dull number scores near nothing. A Tuesday fixture between two eliminated clubs with a shocking number can lead. Audience — STACK — carries the smallest weight on purpose.

The rejects are logged too, with reasons. What a paper passed over is a more honest account of its judgment than what it ran.

The seven checks

Every draft passes through these before it can publish. Each one states its own honest limit, in its own source, because a check that oversells itself is worse than no check.

CheckWhat it measuresWhat it cannot see
readabilityFlesch-Kincaid against a sixth-grade target, plus whether the piece states its question, its answer, why it is surprising, and what the reader getswhether the question is a real question or a rhetorical one
voicePerson. Second-person address, first-person plural, imperatives and semicolons per thousand words, measured against 52,069 words of the editor's own teaching prosewhether the writing is any good
headlineBeats, length, plain vocabulary, whether a number counts things rather than statistics, and the rate of the house's own worst ticwhether the headline is true to the piece
layoutWhether the page declares what it uses — undefined classes and variables, nested anchors, duplicate ids, unbalanced tagscollisions and overflow; those need a browser
spellingBritish spellings in an American paperwords spelled correctly and used wrongly
poll claimsAny ranking or award cited before its scheduled releasea fabrication that happens to land after the release date
queue healthWalks the real calendar for topic clashes, pieces that will be stale by their slot, and buffer depthwhether any of the queued pieces are worth running

There is one standing rule about all of them, learned expensively: when a check disagrees with the work, suspect the check first. It has been the check nine times running.

What broke

This is the section other people leave out, and it is the most useful one. Every item below actually happened and is recorded in the repository with the fix.

A fabricated ranking led a Sunday edition. The piece claimed a team had gone from unranked to tenth in a poll. No such poll existed — the week ran through a holiday and the first in-season poll had not been published. Asked what the new poll said, a search summarizer answered as if it existed, reconstructing a plausible ranking from a previous season. Every surrounding fact was correct, which is exactly what let the false one survive.

The rule now: a search may point you at a fact; it may never be the source of one. Anything that grades a forecast traces to a primary feed. Nothing is cited before its scheduled release.
A model went 15 for 15 and that was the bug. A backtest graded past games against ratings that had already absorbed those games' results. Perfect accuracy was the symptom. The grader now requires a frozen weekly snapshot and exits rather than falling back to current numbers.
Fifty-one social cards used the wrong typeface for months. An older rendering library could not parse a quoted font list, matched nothing, and fell back to a default serif. Nobody reported it because a plausible serif looks fine. Tofu boxes get noticed in a day; a wrong-but-reasonable font never does.
One character silently destroyed a card. A superscript-two entity in a chart label made the renderer reject the whole image, and the generator fell back to a plain stat row. The article shipped with the wrong hero image for weeks. The entity translator's pattern matched letters only, so every entity whose name contains a digit was invisible to it.
The topic icons rendered at 642×494 pixels. They were drawn for 20. The archive and the email feed both copy the headline markup out of the issue, but the stylesheet that sized them lives inside the issue and did not travel. An SVG with no intrinsic size expands to fill its container.
Twenty issues lost a panel's margins; twenty-three printed a share block twice. Same root cause, twice: markup copied to a place its CSS was not, and a find-and-replace that recognized only the newer of two markers. Both were visible on the page for weeks. Both were found by writing a checker, not by looking.
A sign error returned a perfect week. An against-the-spread calculation added where it should have subtracted and reported 14 from 14. It was caught by disbelieving the result, which is the only reason it was caught at all.
We published a tautology as a twenty-seven-year finding. An interactive page plotted the chance of winning against points scored, and against points allowed, and made much of the two curves crossing at exactly 50% every season — reading it as evidence that offense and defense are worth the same. They cross because they must. Every game in which one team scored 24 is the same game in which the other allowed 24, so one curve is one minus the other by construction. In the data they sum to 1.000 at every score; the only slack is the 0.22% of games that end tied.

It was caught by a reader asking why the curves had to cross, which is the question we should have asked ourselves and did not. The page now says so, shows the observed win rates with 95% intervals and the number of games behind each point, and reserves the word "finding" for the part that is one: the curve slides right as scoring rises, and its slope does not change.

The pattern across every one of these is worth stating plainly, because it is the real lesson of building anything like this:

The failures that survive are the ones that still look fine. Nothing was blank, nothing errored, and every broken thing rendered as a slightly worse version of the intended thing.

Which is why the answer is never "be more careful." Careful has already failed by the time you find out. The answer is an instrument that looks at the artifact as printed, and a written record so the same mistake costs less the second time.

The accountability edition

Every Sunday the paper grades itself in public. Predictions from the week are re-run against what actually happened and marked hit, miss, partial or pending. Misses are the point; a Sunday edition that cannot find anything it got wrong is usually one that did not look.

For anything involving our own forecasting, the reasoning is sealed before kickoff — written, moved out of the repository, and published only as a cryptographic digest of its exact bytes. Afterwards the text goes up and the digest is recomputed. Change one character and it will not match.

This exists because anybody can write a rationale after a result and sincerely believe they thought it beforehand. That is memory working normally, which is precisely why a promise not to do it is worth nothing and a hash is worth something.

Take it

The entire repository is public: the scripts, the checks, the editorial rules, the failure log, the prompts. If you are a writer with a subject and no engine, this is the engine. If you are a newsroom wondering whether this works, the answer is that it produced a daily paper for six months with one person's judgment in front of it, and the judgment is still the expensive part.

What you actually need: a subject you know better than your reader, a source of real data with a primary feed, a willingness to publish your misses, and about a two weeks of setup. Not a newsroom. Not a budget.

What you should copy first: not the code. The failure log. Start the document that records what went wrong and what the fix was, on day one, before you have anything to put in it. Everything else here grew out of that file.

The Sports Page is licensed for non-commercial use with attribution. Borrow it and give it back better. If you want to do something commercial with it, the door is open — please knock. Full terms at thesportspage.net/license.html.

The Sports Page — one question per issue, answered with numbers.
Every figure on this page was measured from the repository on 6 October 2026.
The paper · The newsroom · Ask us something