Every part of Fantasy Joes comes back to one move: two NFL players, you tap the one you’d rather draft. Do that enough times and you’ve built your own ranking without ever writing a list.

Last week I wrote about turning the record of all those picks into search pages. Any matchup with enough real picks behind it — at least 25, from at least 10 different people — gets a page showing which way the crowd leaned and on how many picks. The big debates carry the most weight: the Jahmyr Gibbs vs. Bijan Robinson page is sitting on 285 duels as I write this. There were 145 pages when that post went up; the catalog is around 175 now, because new matchups keep crossing the bar.

Those pages worked, but there was nothing to do on them. You’d land from Google, and the page would show you the crowd’s answer to a question it never let you answer yourself. The whole time, the page was a matchup: two players and a “vs.” That’s the exact thing the game is built on. It was the one screen where I showed you a duel and didn’t let you play it.

This week they became part of the game. And separately, each one learned to write its own analysis.

Making the page playable

Land on a compare page now and the two players are cards you can tap. Pick one and it lights up gold while the other dims, and the crowd-split bar slides over to fold your vote into the count. About a second later the page moves itself to the next matchup — no button, no “next.” The order is set fresh each day: the biggest debates first, then on down through the catalog, reshuffled overnight so tomorrow’s run is different.

You can try it here: fantasyjoes.gg/compare/jahmyr-gibbs-vs-bijan-robinson.

Here’s the part that matters: those picks aren’t throwaway poll votes. They’re the same move that builds a ranking inside the app, and they count the same way. Someone who lands from Google and taps through a few debates has already started building their own draft board, before they’ve signed up for anything. A bar at the bottom keeps count, and tapping it replays your picks into a real board and shows where you already sit higher or lower than the consensus. A few picks is a start, not a finished board — the board sharpens the more calls you make — but the work has begun, and continuing it is just more of what you were already doing.

The page Google sent you to has become the front door of the game.

Same page, two readers

There was one constraint that shaped all of it: these pages only matter if Google can crawl them and a CDN can cache them, and a live vote is exactly the kind of feature that normally forces a page to render fresh per visitor. So the game is a layer. Everything about the players renders on the server into plain HTML, same as before, and that’s what the crawler sees; the voting loads afterward and needs no login. Google gets a fast, cached, unchanged page. A person gets a game.

Each page learned to write

The second thing that shipped: a written summary of each matchup, under the crowd split. Ninety to 160 words on what actually decides this pair — the injury, the new offense, the age gap — labeled right on the page: “AI-written, fact-checked summary. Neutral — no pick implied.”

I wasn’t going to hand-write 175 of those and keep them current through an NFL offseason. But AI-generated pages have a deserved reputation as template sludge, and sludge would cost more trust than the paragraph is worth. So no blurb ships until it survives a pipeline: fresh research is pulled on each player, and the writer has to name the one question that decides the matchup before it writes a word, then write to that question. On the Gibbs–Bijan page right now, that question is workload: Detroit cleared the way for Gibbs to be an every-down back for the first time, while Atlanta’s new coach has said on record he wants to take work off Robinson. That’s a real fantasy question, not a stat recital. The draft then goes through a fact-checker that traces every claim back to the research, a reader critic that asks whether a fantasy player would actually learn something, and a set of mechanical guards — my favorite rejects any blurb whose first eight words open like any other blurb’s, so no two pages can fall into the same template.

The first calibration batch was humbling in an unexpected direction: one blurb out of fifteen passed, and when I dug into the failures, most of them were my checks being wrong, not the writing — a guard banning coach names the research had verified, a critic “correcting” a true fact from its own stale memory. I fixed the rules the failures exposed and reran: eight of fourteen came back clean, and the stragglers passed on later runs.

When a blurb keeps failing, the system does the thing most AI content pipelines won’t: it refuses. A handful of published pages carry no summary at all, because the gate would rather ship nothing. No blurb beats a bad blurb. The rest only regenerate when something about a player actually changes — a trade, an injury, a real move in draft position — so a quiet news week rewrites nothing and the pages don’t churn.

Where this stands

I like where these pages are. The data behind them is a thing the big fantasy sites don’t publish: not where a player gets drafted on average, but how a crowd splits when it’s forced to choose between these exact two — a head-to-head tally, built from real picks. And now the page plays like the game and reads like a person wrote it. Whether it pays off comes down to the same open question as last week: Google has to send people, and getting it to is the fight I’m in now. I hope it’s not too late in the summer for it to matter before draft season.

If you’re building something, the part worth stealing is the same one I keep relearning: the page you made for search was probably built around something a person could do, not just read. Mine were showing people a decision. It turned out they’d rather make it.