← back
cat blog/tft_tactical_overlay.md

Building a TFT Overlay: Smart Composition Recommendations in Real-Time

Published: August 11, 2025

The Problem: Static Meta vs Dynamic Gameplay

Most TFT tools like MetaTFT.com show you what's theoretically strong this patch - tier lists, optimal compositions, and item guides. But TFT success comes from adapting to your specific situation: the champions you've been offered, the items you've collected, and what your opponents are contesting.

So I built TacticalFlow: a real-time overlay that analyzes your current board state and recommends what YOU should play right now. Instead of forcing the S-tier composition every game, it evaluates your actual resources and suggests the best path forward.

The result? A tool that understands TFT's fundamental truth - flexibility beats forcing.

From Memory Reading to Overwolf APIs

My previous TFT tools used memory reading with Python and the pyMeow library - a complex approach requiring pattern scanning, offset calculations, and constant maintenance as the game updates. Here's what that looked like:

Old Solution: Memory Reading with Pattern Scanning ▼ Click to expand/collapse

This approach was cumbersome and fragile. Every game patch could break the memory offsets. You can see the complexity in my previous memory reading work here:

Overwolf overlays eliminate all this complexity. No reverse engineering, no offset hunting, no anti-cheat concerns. Just clean API access to game state through legitimate channels.

TFT Overlay showing composition recommendations
TacticalFlow overlay showing real-time composition recommendations based on current board state

Architecture: Event-Driven State Management

The key insight that makes Overwolf overlays performant is their event-driven architecture. Instead of constantly polling game state (expensive and inefficient), the system only updates when the game state actually changes.

How Event-Driven Updates Work

The background script registers with Overwolf for TFT (game ID 5426) and listens for specific state changes:

Event-Driven State Management ▼ Click to expand/collapse

The system intelligently responds to different types of events. Match start/end events control the overlay lifecycle, while state changes (board, bench, shop) trigger recommendation recalculation:

Event-Specific Recommendation Triggers ▼ Click to expand/collapse

Why this matters: The overlay only burns CPU cycles when your game state actually changes. No wasted computation checking for updates that haven't happened. This keeps the system lightweight and responsive during gameplay.

State Processing and Debugging

The background script maintains a comprehensive view of the game state and provides detailed logging for debugging recommendation accuracy:

Comprehensive State Tracking Implementation ▼ Click to expand/collapse

This shows how the system processes incoming game events and transforms them into actionable recommendation data. The logging reveals exactly what information Overwolf provides and how the algorithm interprets it.

The Recommendation Engine: Understanding TFT Strategy

The challenge wasn't just accessing game data - it was encoding TFT strategy into an algorithm. How do you teach a computer to recognize good vs bad situations?

The Scoring Formula

Each composition gets evaluated on five factors:

final_score = base_tier + champion_ownership + item_synergy + trait_coverage + feasibility

Base tier comes from TFTFlow's rankings (S/A/B tier). But the other factors matter more - they determine if you can actually execute the composition.

Champion scoring reflects TFT's harsh reality: carries are everything. Missing your main carry usually means 8th place. Missing a support? You'll probably be fine.

Champion Scoring Algorithm ▼ Click to expand/collapse

The Component Sharing Problem

Here's where most TFT tools fail. Consider this scenario:

  • Ashe wants: 2× Guinsoo's Rageblade (bow + rod each) + 1× Runaan's Hurricane (bow + cloak)
  • You have: 1 bow, 2 rods, 1 cloak

A naive algorithm says "you can build all these items!" because bow+rod=Guinsoo's, bow+cloak=Runaan's. But you can't - there's only one bow. The algorithm needs to understand resource contention:

Component Sharing Prevention Algorithm ▼ Click to expand/collapse

Shop Data Processing and Parsing

The overlay parses live shop data from Overwolf's store events, extracting champion information for each of the 5 shop slots:

Shop Data Extraction and Processing ▼ Click to expand/collapse

Data Pipeline: Offline-First Architecture

Why Offline-First?

TFTFlow.com has comprehensive composition data, but it's a lot to scrape and only updates weekly. More importantly, my Overwolf dev overlay (without submitting to their store) cannot make external HTTP requests during runtime. The solution: I built a scraper that pulls all the information necessary that I run periodically (once a week).

// Data fetching strategy
scripts/fetch-data.js:
1. Scrape champion data from TFTFlow's JavaScript files  
2. Download tier list HTML and extract 39 composition links
3. Fetch individual composition pages with 500ms rate limiting
4. Store everything in src/data/raw/ for offline parsing

Runtime behavior:
- Zero external requests during gameplay
- All analysis happens locally  
- Data updates only when patches release

This offline-first approach solves multiple problems: eliminates CORS issues, removes network dependencies during gameplay, avoids rate limiting concerns, and is required since dev overlays can't make external requests.

TFTFlow composition data source
TFTFlow.com serves as the primary data source for composition and meta information

What I Learned

Legitimacy > Cleverness

My old memory reading approach was technically impressive but fundamentally fragile. Every patch could break it. Riot's anti-cheat made it risky. The complexity was enormous.

Overwolf's legitimate APIs eliminated all of that. No reverse engineering, no offset hunting, no ban risk. The difference between spending days on infrastructure versus hours on actual functionality.

Understanding Strategy Through Code

Building TacticalFlow forced me to deeply understand TFT mechanics. Why are carries worth 3x supports in scoring? What makes component sharing so crucial? How do feasibility calculations actually work?

You can't automate what you don't understand. The algorithm became a mirror for my own strategic knowledge.

The Paradox of Automation

Here's the irony: I rarely use TacticalFlow in actual games. When I do, it feels like a crutch that makes me worse at TFT. I second-guess my intuition, rely on external suggestions instead of reading the game state myself.

But building it taught me more about TFT than hundreds of games could. To create an algorithm that makes good recommendations, I had to deeply understand:

  • Why carry champions matter exponentially more than supports
  • How component scarcity creates strategic bottlenecks
  • When flexibility beats forcing optimal compositions
  • How economic timing affects feasibility calculations

The real value wasn't the tool - it was understanding the game well enough to automate it.

Lessons Beyond TFT

This project reinforced something important about learning: sometimes the best way to master a domain is to try automating it. The process forces you to make your intuitions explicit, to understand the edge cases, to formalize what "good" actually means.

TacticalFlow sits unused in my development folder. But the strategic insights from building it improved my gameplay more than any guide or tier list ever could.


This project was built as a technical exercise to explore real-time game analysis and Overwolf development. The focus was on understanding TFT strategy deeply enough to encode it algorithmically, rather than creating a commercial product.