Lane matchup cheatsheet
Quick breakdown of enemy abilities, key cooldowns, and early lane gameplans. I designed this view to refresh critical threats in seconds before the match begins.

Lane matchup analysis and tactical notebook for League of Legends, built for quick lookups during the match loading screen.
In League of Legends, lane outcomes often come down to details: knowing enemy ability cooldowns or specific matchup habits. Mainstream stat sites dump global win rate averages across thousands of games, but leave no room for personal notes or reviewing past mistakes. Sitting down to play, I needed something I could glance at during the 60-second loading screen to quickly recall how to play against a specific opponent and what went wrong last time.
I built LOLES as a dedicated web app backed by PostgreSQL on my own server. My goal was to create a tool that loads within a fraction of a second, automatically ingests my match history from the Riot Games API, and surfaces tactical notes before the match starts.
Quick breakdown of enemy abilities, key cooldowns, and early lane gameplans. I designed this view to refresh critical threats in seconds before the match begins.

Custom notes attached to specific champions and lane pairings. Whenever I run into the same matchup again, my past observations and takeaways from wins or losses surface automatically.

Detailed breakdown of my own games filtered by role and champion. Lets me inspect my actual win rate against a specific opponent rather than relying on guesswork.

The official Riot Games API has clear limitations: it only returns shallow history for the last few dozen matches and glosses over edge cases. I built a synchronization pipeline that persists games into a PostgreSQL database on my server, preserving an archive of hundreds of matches. During data ingestion, I had to handle edge cases manually. For instance, the Riot API marks remakes simply as wins or losses. I wrote custom detection logic: if a match finishes under 3 minutes, the system classifies it as a remake, excluding it from win rates and average stat calculations.
With over 160 champions in League of Legends, bottom lane matchups are dynamic 2v2 battles where both the carry (ADC) and the support dictate the lane. Simple champion-to-champion filtering was useless. I structured database queries and UI filters to support combinations of role, selected champion, and opposing duos. This allows me to pull up notes and stats for exact lane configurations (such as playing a specific ADC paired with a specific support against an opposing duo).