Inspiration

In competitive esports, information is ammunition. Coaches spend countless hours manually scraping VODs and spreadsheets to understand opponent tendencies. I wanted to automate this "grunt work" by leveraging the GRID Data Platform. The goal was to build a tool that doesn't just show stats, but thinks like a coach, identifying "win conditions," "cracks in the armour," and "relative weaknesses" even in the strongest teams.

What it does

Stratus Pulse is an automated scouting report generator used by Cloud9 to prepare for upcoming matches in both Valorant and League of Legends.

  • Instant Scouting: Select any opponent (e.g., Sentinels, Team Liquid) and instantly fetch their last 15 matches from GRID.
  • Tactical Analysis: It auto-generates a "How to Beat Them" strategy card, flagging primary kill targets (low KDA/high deaths) and map veto recommendations.
  • Pattern Recognition: Visualises Agent/Champion pools with "Presence %" and role-based groupings (Duelist, Controller, etc.) to show compositional priorities at a glance.
  • Relative Weakness Engine: For dominant teams with high win rates, the system digs deeper to find relative weaknesses—identifying the "least good" map to force or the "most vulnerable" player on a winning roster.

How we built it

I built Stratus Pulse using React and TypeScript for the frontend, powered by the GRID.gg API for official match data and Junie which was used to source data from the GRID.gg and to structure the UI.

  • Data Layer: I built a custom GridTransformer service that normalizes data across different esports titles (LoL and Valorant), allowing a single unified interface for multi-game organizations.
  • Visual Engine: I used Recharts for data visualization, creating custom gradient-shaded charts to represent agent role hierarchies visually.
  • Performance: To handle GRID's API rate limits while fetching deep match histories, I implemented a sequential queuing system that processes matches one-by-one with intelligent backoff, ensuring 100% data reliability without 429 errors.

Challenges we ran into

  • The "Perfect Team" Problem: Initially, the "Weakness Detector" looked for negative stats (WR < 50%, KDA < 1.0). But when scouting top-tier teams like Sentinels, they often had no negative stats. I had to rewrite the logic to find relative weaknesses (lowest WR, even if positive) to ensure the tool always provided actionable "Best Chance" advice.
  • API Rate Limiting: Fetching 15 full match details simultaneously triggered GRID's rate limits. I solved this by refactoring the fetch logic from Promise.all to a sequential-loop architecture with delay buffers.
  • Cross-Game Normalization: Mapping "Champions" (LoL) and "Agents" (Valorant) to a shared "Role" system required a flexible abstraction layer in our types and services.

Accomplishments that we're proud of

  • Robust "How to Win" Logic: I'm proud that the tool offers specific, data-backed advice (e.g., "Ban Haven, Force Ascent") rather than just dumping raw numbers.
  • Visual Polish: The gradient-shaded role charts allow coaches to instantly read a team's compositional "fingerprint" without reading a single number.
  • Stability: The application is battle-tested against rate limits and missing data, providing graceful fallbacks so a coach is never left looking at a blank screen.

What we learned

  • Context is King: Raw data (picks/bans) isn't enough. I learned that metrics like "Presence %" (matches appeared in) are far more valuable for scouting than simple "Pick Rate" (total picks / total slots).
  • Data Scarcity: I learned to build robust frontends that can handle "sparse" data when opponents haven't played many official matches on the current patch.

What's next for Stratus Pulse Scouting Report

  • Round-Level Economics: I plan to ingest round-by-round events to analyze "Eco vs. Buy" win rates for Valorant.
  • AI Integration: I want to connect our AnalysisService to the scouting report, allowing coaches to ask natural language questions like "How does their Jett entry differ from ours?"
  • Live Draft Assistant: Using the historical data to recommend real-time bans during the agent select phase.

Built With

Share this project:

Updates