Skip to content
All projects
HackathonRuneSight4 min read

RuneSight: an AI coach for League of Legends match history

Stats sites give League of Legends players numbers, not advice. RuneSight, built solo for AWS Rift Rewind, puts five Bedrock agents next to your match history to tell you what to fix and how you compare.

RuneSight dashboard in dark mode: recent games, queue tabs for Ranked Solo/Duo, Flex, Normal and ARAM, and win rate, KDA, CS and damage cards

The problem

Stats sites tell League of Legends players their CS per minute, their KDA and their win rate per champion. They don't tell you what to do about it. The account I tested with sat in Silver I. Knowing it averages 6.5 CS a minute is a number. Knowing that's normal for Silver, what a Master player does instead, and which three habits to change first is advice. That second part is what a coach gives you, and most players don't have one.

What I built

RuneSight is an AI coach that reads your real match history. I built it alone for AWS Rift Rewind 2025, an online hackathon where Riot and AWS asked people to build something on League match data with Amazon Bedrock. You sign in with a Riot ID, it loads your last twenty games per queue, shows a dashboard, and puts a chat next to it where you can ask "how good is my farm?" or "compare me with my duo" and get an answer grounded in your own games.

RuneSight landing page with a League champion in the background and Start Analysis and Watch Demo buttons
The landing page. The hackathon theme was League, so the page leans into it.

What it does

  • Dashboard per queue. Recent games with win rate, KDA, CS and damage, split into All, Ranked Solo/Duo, Flex, Normal and ARAM tabs.
  • Five coaches in one chat. A Performance Analyst, a Champion Expert, a Team Synergy Specialist, a Comparison Analyst and a Match Summarizer, each with its own prompt and tools.
  • Automatic routing. In AUTO mode the question goes to the right coach on its own. You can also pick one by hand, and a label above each answer says who replied.
  • Benchmarks by rank. Answers compare your numbers with what players at higher ranks do, using a small knowledge base I wrote: six guides on fundamentals, farming, macro play, team composition and pro drafting. The Comparison Analyst puts you side by side with a friend.
Chat in AUTO mode: a question about farming answered by the Performance Analyst with CS benchmarks per rank
AUTO mode. A question about farm went to the Performance Analyst without asking a model to decide.
AI Analysis Chat with example prompts grouped by Performance, Champion Expertise and Player Comparison
The chat opens with prompts grouped by agent, so you can see what each coach is for.

Why these tools

Amazon Bedrock was the hackathon's requirement, and it gave me Claude Sonnet 4.5 to write the coaching. Strands Agents sits on top because the product is really five specialists that each need their own tools; Strands lets them share one tool that fetches a player's matches while keeping separate prompts. The Riot Games API is the only source of truth: every answer starts from the player's actual games, not from what a model thinks Silver players do.

Choosing the coach is not an AI call. The obvious way is to ask a model first ("which of these five should answer?"), but that's an extra round trip to Bedrock before the real answer starts. Instead the router scores the question with keywords: "compare", "duo" or "teammate" point to the Comparison Analyst, "how to play" to the Champion Expert, "last 10 games" to the Summarizer, and the Performance Analyst takes anything unclear. It's crude, instant and free, and when it gets a question wrong you can read the rule that did it and fix it in one line.

What was hard

Riot's rate limit. A personal development key allows 20 requests per second and 100 every two minutes, and twenty games means twenty separate match requests. To make the dashboard feel fast I prefetched every queue tab, which is the whole two-minute budget in a single page load. The log filled with 429 Too Many Requests, and the dashboard showed empty cards.

Terminal log full of Riot API 429 errors and retry warnings
Twenty match requests, three retries each, 2 s → 4 s → 8 s backoff, and most of them still failing.

The fix was a cache that knows how fast each kind of data goes stale: a Riot ID for 24 hours, the list of recent games for five minutes, a finished match for an hour (it never changes), plus five minutes of cache in the browser and backoff on every 429. A match that's already over is a fact, so fetch it once. Along the way I learned that the tag in a Riot ID like Name#LAG doesn't tell you the region, so the backend now asks Riot where the player actually plays.

The other lesson was smaller and more annoying. The frontend built on my laptop and failed on Amplify for seven commits in a row, because the standard Python .gitignore ignores any folder called lib/, and eight files of my React app lived in frontend/src/lib. The fix was one line.

What it became

By the end of 10 November RuneSight was live on Amplify, with the FastAPI backend in a Lambda container behind it, all inside the AWS setup the hackathon was built around. The chat answered with real numbers from real games: death rate, CS per minute against rank benchmarks, a head-to-head with a friend.

Then the model changed under me. Everything was built and tuned on Claude Sonnet 4.5 through Bedrock, and the demo video was recorded with it. After that I ran into problems with Sonnet credits on my AWS account, and the deployed backend moved to Amazon Nova Pro as a fallback. The last commit, on 11 November, is mostly a README note saying so: the live version is a fallback, tool calling isn't tuned for Nova, and if you want to see it as intended you should run it locally with Sonnet.

I'm glad I wrote that down instead of hiding it. The app is no longer online, but the repo is public and the note is still the first thing you read.