Logo LOLES

LOLES

Lane matchup analysis and tactical notebook for League of Legends, built for quick lookups during the match loading screen.

Next.jsTypeScriptTailwind CSSRiot Games APIPostgreSQL

Genesis & Objective

Problem & Context

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.

Primary Goal

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.

Key Features

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.

Zrzut ekranu modułu: Lane matchup cheatsheet

Personal tactical notes

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.

Zrzut ekranu modułu: Personal tactical notes

Filtered history and head-to-head records

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.

Zrzut ekranu modułu: Filtered history and head-to-head records

Engineering Challenges

Ingesting Riot API match history and data normalization

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.

Multi-dimensional matchup and notes filtering

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).