I Built an AI NRL Predictor. It's Honest About Being Wrong.
I am not a sports analyst. I don’t have insider knowledge of team sheet dynamics, injury recovery timelines, or the subtle psychological impact of playing a Thursday night game in Canberra in July. What I do have is Claude, a Python environment, and a dangerous amount of free time.
The result is nrl-predictor.ohare.id.au — an AI-powered NRL match predictor that publishes its picks every week and, crucially, publishes its accuracy record even when it’s wrong. Especially when it’s wrong.
The Idea
The pitch was simple: every Thursday and Friday, NRL clubs release their official team sheets — the 17 players taking the field. At that point, you know roughly who’s injured, who’s been dropped, and which team has somehow picked a prop who hasn’t played since Round 3. Surely, I thought, Claude could take that information, combine it with form, head-to-head history, weather, and a bit of judgment, and produce better tips than my wife, who picks based on jersey colour.
(She finished third in our tipping comp last year. I do not want to talk about it.)
The Architecture
Here’s where things escalated.
A reasonable person might have built a Python script that runs locally, queries some APIs, and emails the results. I instead built a fully serverless event-driven pipeline on AWS, because I am a developer and we cannot help ourselves.
The flow looks like this:
EventBridge cron
→ Scraper Lambdas (draw, team sheets, ladder, results, weather, articles)
→ DynamoDB + S3
→ Agent Lambda (LangGraph + Claude)
→ Predictions DynamoDB
→ API Gateway
→ Next.js frontend (AWS Amplify)
That’s seven different AWS services, for something that is fundamentally: read some rugby stats, ask Claude who’s going to win.
I have no regrets.
How the Agent Works
The brain of the system is a LangGraph agent running inside a Lambda function. LangGraph lets you build stateful agent workflows — think of it as giving Claude a structured loop where it can use tools, check results, and decide what to do next, rather than just generating a single response.
For each match, the agent:
- Pulls the team sheets from DynamoDB
- Uses Tavily (a search API) to look up recent news, injury updates, and form guides
- Passes all of that context to Claude, which reasons through the match and writes a prediction with explicit reasoning
The “write out the reasoning” part was deliberate. It’s easy to just output “Panthers by 6” — but the interesting thing is why. Forcing the model to articulate its reasoning makes the predictions more useful to read, and honestly makes it easier to see when the reasoning is obviously wrong in hindsight.
The Honest Record
This was the part I was most insistent on: every prediction goes on the record, and the accuracy is published alongside the picks.
There’s a particular genre of AI sports prediction tool that is suspiciously coy about its historical accuracy. You’ll see bold claims up front and very little data on whether the thing actually works. I wanted to go the other way: full transparency, tracked automatically.
After each round, a post-match scoring Lambda runs, compares the predictions against the actual results, and updates the accuracy metrics. These are displayed on the site. If Claude tips the Bulldogs and they get beaten by 30, that counts against the record.
This is either good epistemics or a form of public self-flagellation. Possibly both.
The Tech Stack
For anyone interested in the specifics:
Backend
- Python 3.12
- LangGraph for agent orchestration
- AWS Lambda for compute (no servers to manage, billing goes to zero when it’s not running)
- DynamoDB for predictions and scraped data
- S3 for raw data storage
- EventBridge for scheduling the weekly pipeline
Frontend
- Next.js with TypeScript
- AWS Amplify for hosting and CI/CD
APIs
- Anthropic Claude for the actual predictions
- Tavily for web search / research
The scrapers run on a schedule throughout the week — pulling draw data, ladder positions, and results as they come in. The prediction pipeline runs once the team sheets are confirmed on Thursday/Friday nights, so Claude has the full picture before making its call.
Does It Work?
Moderately well, which is approximately what I expected.
Predicting NRL matches is genuinely hard. The competition is fairly even, upsets happen constantly, and team sheets can change right up until kick-off. A model that tips the favourite every week would get maybe 55–60% accuracy. The interesting question is whether smarter reasoning — incorporating injuries, form, head-to-head, and context — can do meaningfully better than that.
The honest answer so far: sometimes yes, sometimes no. Which is also roughly the accuracy of every human expert I’ve ever read.
At minimum it’s beating my wife. That’s the metric that matters.
Try It
Predictions are published at nrl-predictor.ohare.id.au every week once the team sheets drop. The code is on GitHub at github.com/timothyohare/nrl-predictor if you want to see the full implementation or adapt it for your own sport of choice.
And if you’re in a tipping comp and you use it and it costs you money, I accept no liability. Claude accepts no liability. My wife probably has an opinion though.