Field Note · Blog

Building CoachRogue’s Live Overlay — A League OBS Tool That Watches the Client

CoachRogue asked CompleteTech for a live League OBS overlay that watches the client, switches accounts mid-session, and stays polite to the Riot API. Open-source, MIT licensed, drops in as a Browser Source.


CoachRogue asked CompleteTech LLC to build an OBS overlay for his League of Legends stream. Not a static graphic — a live overlay that knows which account is currently in-client, pulls the right ranked data, refreshes during play, and switches with him when he hops between accounts mid-session. The result is open-source on GitHub: CompleteTech-LLC/LoL_OBS_Overlay, mirrored at ctech.llc/lolobs. MIT licensed, Python, drops into OBS as a browser source.

This is the field note on what we built and why each piece of it earned its place.

Who CoachRogue is

CoachRogue is Jake Sharwood, an Australian League of Legends coach and content creator with eight years of pro-level experience behind him. The short bio on coachrogue.com reads: “I’ve been a full time pro player for 7 years, now I am a YouTuber and Coach for all ranks from iron to pro level.” He peaked at rank 1 challenger and reached challenger on four different servers — the kind of climbing record that makes the “coach” part of the title load-bearing rather than decorative. His most recent pro coaching role was head coach for Apex Mission Impossible in the LCO (League Circuit Oceania).

His YouTube channel is the home base — described in his own words as “basically a edited down full game from my stream with the hope of being a more chilled style you can whack on your 2nd screen or TV in the background and binge away.” Twitch (twitch.tv/coachroguelol) is where the unedited version happens: solo queue with educational commentary several days a week. Private coaching runs through coachrogue.com, and his student community lives in the Discord.

Two things matter here for the overlay brief. First, he’s a coach — the audience is paying attention to how he plays, not just whether he wins. Second, climbing on multiple servers means he plays multiple accounts, and student-review sessions sometimes mean playing on a student’s account. Whatever the overlay shows, it has to keep up with that.

The brief, in one sentence

He wanted his overlay to do what coaching demands: tell the chat exactly which account he’s on, where it sits in the climb, and how the session has gone so far today, without him touching anything between games. The naive version of this is a hand-edited PNG you remember to swap when you log in. The right version is the overlay watching the client and updating itself.

What ships in the repo

  • Live client detection. When League boots a match, the overlay sees it. src/detection/client_detector.py watches the local League client; streaming_session_manager.py threads “you are streaming right now” through the rest of the system.
  • Account-switch awareness. CoachRogue moves between accounts the way a piano teacher moves between rooms. The overlay reads which summoner is currently in-client and re-pulls that account’s ranked + match-history data on the fly — no manual scene swap.
  • Riot API integration that doesn’t fall over. src/api/riot_api.py handles rate limiting, error backoff, and key rotation. Long sessions don’t hammer the API; transient 429s and 5xxs don’t blank the overlay.
  • Today-only session stats. The overlay carves out “games since you started streaming” as its own number, separate from lifetime rank. That’s the number the chat actually wants. src/data/match_history.py filters and tags it.
  • Overlay generation as static files. src/overlay/obs_overlay.py writes HTML into obs_data/; OBS renders it as a Browser Source pointed at a local file. No external server, no auth headache — the overlay refreshes itself, OBS just loads the page.
  • Tunable timing. The .env exposes GAME_CHECK_INTERVAL, OVERLAY_UPDATE_INTERVAL, ACCOUNT_REFRESH_INTERVAL, and RATE_LIMIT_DELAY as knobs. CoachRogue’s defaults are 1s game check, 5s overlay update, 60s idle refresh — tight enough that the overlay feels live, slack enough to stay polite to the API.
  • All major regions. NA1, EUW1, EUN1, KR, JP1, BR1, LAN, LAS, OC1, RU, TR1. Coaching guests can play wherever they queue.

The three design decisions worth naming

  1. The overlay is a static HTML file, not a hosted service. OBS reads it from disk. That single choice removes an entire category of stream-day failure modes — no auth tokens to expire mid-broadcast, no cloud region to be down, no CORS surprise. If the Python tool crashes, the last good overlay is still on screen until you fix it. Streaming infrastructure should fail soft, and the static-file route is how you get there.
  2. Detection is local, not API-polled. “Which account is CoachRogue on right now” is answered by reading the local League client, not by polling Riot’s servers. Faster, kinder to rate limits, and correct in cases where the API hasn’t caught up to the client yet.
  3. Session tracking is its own concept. “Today’s games” is more useful to a coaching audience than “lifetime stats,” and it’s less useful if it bleeds across stream days. The session manager makes the boundary explicit so the on-screen number always means what the chat thinks it means.

Setup, the short version

  • pip install -r requirements.txt
  • Copy .env.example to .env, drop in a Riot API key from the Riot Developer Portal
  • python main.py monitor
  • In OBS, add a Browser Source pointed at file:///YOUR_PATH/obs_data/04_combined_overlay.html at 800×200, with “refresh browser when scene becomes active” on

That’s the entire path from clone to live overlay. The README in the repo has the longer cut.

Why we took the work

Most CompleteTech work is small-business systems, AI workflows, and security disclosures — this is the streaming-tools cousin of the same instinct. CoachRogue had a real, repeated problem (the manual scene-swap-and-edit loop), a constraint that made off-the-shelf tools awkward (multiple accounts, mid-session switching), and an audience that benefits from the better version (his Discord students). Narrow scope, working slice, ship it open-source so other coaches in the same situation don’t pay to rebuild it.

If you stream League and the overlay sounds like the one you wished you had, clone it. If you’re curious about the coaching side, that’s where to find CoachRogue:

Repository: github.com/CompleteTech-LLC/LoL_OBS_Overlay
Permalink: ctech.llc/lolobs
Disclaimer: not affiliated with Riot Games. League of Legends is a trademark of Riot Games, Inc.