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.

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.


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.

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.
