Team Roulette

Team Roulette

A League of Legends custom-game randomizer that splits teams, assigns champions, and generates deliberately off-meta builds — all in one static HTML file.

Role
Solo developer
Year
2026
Stack
HTML · JavaScript · Canvas
Team Roulette interface

Team Roulette solves a small, real annoyance: getting a group of friends into a balanced League of Legends custom game without someone having to organise it. Enter the names, hit randomize, and it splits the group into two sides — handling odd player counts by making one team a player larger rather than refusing to continue.

Beyond the team split it can assign each player a random champion, two summoner spells, a lane, and a full six-item build with a rune page. All champion, item, rune, and spell data comes from Riot Data Dragon CDN, which needs no API key, so the whole thing is a single index.html with no dependencies, no build step, and no backend. It queries Riot version manifest on load and always pulls the newest patch, so the item and champion pools stay current without anyone redeploying it.

The build generator is the part that took real thought. Fully random items would produce nonsense, so it classifies each champion into an archetype from its Data Dragon tags, fills most of the build from that archetype stat pool, then deliberately pulls the remaining slots from pools it is not supposed to want. The result is chaotic but still playable, which is the entire point of a custom game.

Engineering notes

Off-meta by construction, not by accident

Each champion is classified into one of seven archetypes, given two to three items from its expected pool, then topped up from pools explicitly listed as off-archetype. Constraining the randomness this way produces builds that are funny rather than unusable.

Deriving item roles Riot does not provide

Data Dragon does not reliably tag items by what they actually do, so items are sorted into AP, AD, attack speed, tank, and support pools by inspecting their stat fields and falling back to searching the description text. Every pool has a size check that falls back to a generic item list, so a change to Riot data shape degrades the builds instead of breaking the page.

No backend, including for sharing

Results are shared by base64-encoding the generated teams into a URL query parameter, so a link reproduces the exact draft with nothing stored anywhere. The same constraint drives the rest of the app — it is hosted as a static file and holds no state between visits.

Built with

HTMLJavaScriptCanvasRiot Data Dragon