Inspiration

In professional esports, the difference between a champion and a runner-up is often a single decision made in a split second. Coaches and analysts are currently overwhelmed with raw data—thousands of events per match, messy spreadsheets, and hindsight bias. We asked ourselves: What if a coach had an AI assistant that could see everything in real-time and even predict the outcome of alternative strategies? That was the spark for the Team Intuition Engine.

What it does

Team Intuition Engine is a comprehensive tactical dashboard that ingests live esports data directly from the GRID Data Platform. It provides:

  • Real-Time Glass Dashboard: A stunning, low-latency interface that visualizes live match states for League of Legends and Valorant.
  • The What-If Simulator: A powerful tool that allows coaches to pause a live match (mentally) and simulate alternative decisions. "Should we have forced a buy?" "What if we rotated to B site?" The engine calculates success probabilities for these hypothetical scenarios.
  • Macro Review: A high-level strategic view that tracks team rotations, economy management, and objective control, helping teams identify their own habits and break them.

How I built it

We built Team Intuition as a high-performance, dual-service architecture:

  • Backend (The Brain): Built with Python and FastAPI, this service connects to GRID's Central Data (GraphQL) and Live Data (WebSocket) APIs. It serves as a normalization layer, transforming complex, game-specific data from LoL and Valorant into a unified internal model. It also powers the simulation logic.
  • Frontend (The Face): A Next.js application using TypeScript and Tailwind CSS. We focused heavily on UX/UI, using Framer Motion for seamless transitions and "Liquid Glass" styling to give it a futuristic, premium feel fit for an esports stage.
  • Deployment: Both services are containerized and deployed on Railway, ensuring production-grade reliability and easy scaling.

Challenges I ran into

  • The Firehose of Data: GRID's WebSocket feed provides an incredible amount of granular data. Managing this flow and normalizing it so that our frontend could render updates without stuttering was a significant engineering challenge.
  • CORS & Production Networking: Connecting our secure production frontend to the backend while handling browser security policies required careful configuration of our middleware and reverse proxies.
  • Unifying Game Models: League of Legends (MOBA) and Valorant (FPS) are fundamentally different. Designing a single GameState data structure that could gracefully handle both "Minion Kills" and "Headshot %" took several iterations of schematic design.

Accomplishments that I'm proud of

  • Universal Game Support: We successfully abstracted the core concept of a "Match" so our dashboard works for both MOBA and FPS titles with minimal code duplication.
  • Zero-Latency Feel: The dashboard feels alive. The animations and data updates happen instantly, creating an immersive experience for the user.
  • The UI: We're really proud of the aesthetic. It helps clarify complex data rather than just displaying it.

What I learned

We learned that context is king. Raw data like "KDA" is meaningless without the context of the game state (economy, map pressure, objective timers). Building the "What-If" simulator taught us that the value of data isn't just in recording history, but in simulating the future.

What's next for Team Intuition Engine

Machine Learning Integration: We plan to train a custom model on historical GRID data to improve the accuracy of our "What-If" simulations. More Titles: Expanding support to CS2 and Dota 2 using the same unified architecture. Coach Collaboration: Adding real-time annotation and telestrator features so coaches can draw plays directly on the live map.

Built With

  • but-railway-is-confirmed)-apis/data:-grid-data-platform-(graphql-&-websocket)-libraries:-framer-motion
  • languages:-python
  • lucide-react
  • next.js
  • pydantic
  • react
  • recharts
  • tailwind-css-platforms:-railway
  • typescript-frameworks:-fastapi
  • vercel-(optional-if-used
Share this project:

Updates