Back to home

Ruled Out

Football injury news across three leagues. It reads public reports, labels every claim by its source, and shows who’s out, doubtful or returning.

Beta

  • Claude Code
  • Claude Haiku
Ruled Out’s Today page on a match day: the top injury stories with players’ photos, beside lists of leagues and teams.Ruled Out’s Today page on a match day: the top injury stories with players’ photos, beside lists of leagues and teams.
Ruled Out’s Today page on a phone: the top injury stories, with a tab bar under them.Ruled Out’s Today page on a phone: the top injury stories, with a tab bar under them.
App · Today
A Ruled Out story on a phone: the headline, its summary and the player’s photo.A Ruled Out story on a phone: the headline, its summary and the player’s photo.
App · Story
A Ruled Out team page on a phone: the next match, then who is likely out.A Ruled Out team page on a phone: the next match, then who is likely out.
App · Team

Why I built it

Injury news is scattered across club statements, journalists and fan accounts, in many languages. A fan can’t easily tell what’s confirmed and what’s rumour, or when a player is actually expected back.

  • 3leagues: Premier League, La Liga, Bundesliga
  • 58teams covered
  • $0.70daily cap on AI spend

What I did

  1. The AI reads; fixed rules decide.

    One AI step: Claude Haiku pulls claims out of articles. Everything after that is rules, and unsure claims go to a short daily review.

    • AI step
    • Code
    1. A script watches about 265 news feedsClubs, journalists and leagues, in several languages, every few minutes.
    2. Filters keep only injury newsArticles about a known player’s injury stay; the rest is dropped.
    3. Claude Haiku reads the articleIt pulls out the claim: which player, what injury, how sure the source is.
    4. Fixed rules check the answerThey decide what the site shows. Unclear claims go to my review inbox.
    5. The site rebuilds every 5 minutesWith the source named on every claim.
    One AI step. Everything around it is code you can test.
  2. Switch models on evidence.

    A cheaper Haiku only replaced the old one after passing two runs on a 125-item hand-labelled test set.

    BeforeRun 1Run 2
    Claims found79.1%86.2%81.4%
    Values right95.5%95.9%96.1%
    Wrong players000
    Cost per call$0.0041$0.00076$0.00083
    Haiku 4.5 against Haiku 5.5 on the same labelled set. About five times cheaper, no wrong players.
  3. Show the source, not just the claim.

    Every claim is labelled Official, Reported, Match data or Unverified. Conflicting reports sit side by side, and stories name their sources in the sentence.

    A Ruled Out story page: the headline, a summary that names its source, and the player’s photo beside the injury’s details.A Ruled Out story page: the headline, a summary that names its source, and the player’s photo beside the injury’s details.
  4. The boards are the spec.

    The first build passed its own checks but didn’t match the design. I had it rebuilt as a strict comparison: every element, within 1px, at 7 widths and in both themes. 17 boards now match within 0.22%.

    Ruled Out’s Today page on a phone, in the dark theme.
    Dark
    Ruled Out’s Today page on a phone, in the light theme.
    Light

More screens

Ruled Out: Match page · team news for both sidesRuled Out: Match page · team news for both sides
Match page · team news for both sides
Ruled Out: Team page · who’s out and when they’re backRuled Out: Team page · who’s out and when they’re back
Team page · who’s out and when they’re back
Ruled Out: Today on web, dark and light
Today on web, dark and light
Ruled Out: Leagues · every absence at a glanceRuled Out: Leagues · every absence at a glance
Leagues · every absence at a glance
Ruled Out: Direction change: scoreboard (rejected) vs newsroom
Direction change: scoreboard (rejected) vs newsroom
Ruled Out: Status words: no bare “Back”
Status words: no bare “Back”
Ruled Out: Sources named in the sentence, not [1] markers
Sources named in the sentence, not [1] markers
Ruled Out: Home, v0 to final
Home, v0 to final

Drag or scroll to browseSwipe to browse

What I learned

  • Claude APIClaude Haiku pulls claims from articles; a labelled test set decides any model switch.
  • Cloudflare Pages and DNSA static Next.js export, redirects and email routing on Cloudflare.
  • Playwright visual checksEvery page compared against the design boards, at 7 widths and in both themes.
  • Background jobsA Node and SQLite engine running as a background service.

More projects

Got a question? I’d like to hear it.

Résumé