Concept & first build: Michael. He built the original per-hero dashboard and surfaced the SQL behind every chart — the Lab is his idea with the tribunal's engine bolted on. Same live database, refreshes with every site update. His original ↗
Your play, per hero, per 10 minutes — against everyone who plays the same hero. Pick yourself, pick a window; every panel re-computes. Tap a hero to open its rivalry table: your per-minute output vs every other player who runs it. CTX = the odds your team actually had that night (frozen forever — computed with the ratings everyone had at the time, so it's honest at every time scale). ±EXP = did you beat those odds. Every panel runs live SQL in your browser; tap "show sql". Head-to-head & duos live on The Tools.
⏳ loading the database (~10 MB first visit, cached after)…
Who & When
Group custom nights only — the games with full detail. Thin records don't testify here.
Dates are game-night dates (ET). Only the Dossier stands still — it reads two clocks on its own.
The Window
The Dossier
Per Hero
Tap a header to sort · tap a row for the rivalry table. K/D/A per 10 minutes ON the hero (exact, from per-hero playtime); DMG/HEAL/FH per 10 from pure games — every role gets final hits, not just DPS. CTX = avg odds your team had those nights. ±EXP = win% − CTX. Heroes under 5 games are hidden — one-off picks aren't evidence.
Hero vs the Lobby
The Rivalry Table
Everyone who runs this hero (5+ pure games in window), per 10 minutes. Same hero, different hands.
The Role Room
Per-10 rates while actually on the role (≥90% of the match on that role's heroes; swapping healers counts). SCORE = the lobby's own weights (GC, 7/21). DPS: final hits 30 · kills 30 · damage 30 · deaths −10. Tank: absorbed 35 · kills 15 · damage 15 · assists 10 · deaths −25. Healer: heals 35 · assists 25 · kills 5 · deaths −35. The game's own MVP picks crown kills in every role, healers included, so we don't use them. 5+ pure games to qualify.
What the data can't see (and we won't pretend it can): WHO you killed, point time, stalls, clutches, speed back to the fight. Those live in the replays and the group chat.
True Strength ignores the date buttons
Win rate can't tell you how good you are, because we choose the teams. Balance a weaker player onto a strong side and their win rate drifts up toward 50; split the best players apart and theirs drift down toward 50. Everyone converges on 50% and the number stops meaning anything.
True strength fixes that: one rating per player fit across every decisive custom at once, where each game holds your teammates AND your opponents to account (a Bradley-Terry model — the same maths behind chess ratings, generalised to teams). Because it's estimated jointly, who you got placed with cancels out.
A career rating and a current rating are not the same thing, and we don't mix them.
Every player carries ONE career coefficient, which means a player whose games are mostly from 2025 is credited with having
beaten the averaged version of opponents who have since got much better — so an old rating reads too high. The lobby
today is harder than the lobby that produced those games. NOW is fit on the last 90 days only and is the column that
counts; Career is the whole record, older games faded on a 150-day half-life. Anyone under 20 games in the last 90 days
gets no current rating at all rather than a flattering old one.
Read the gaps, not the order. The model separates the top of this board cleanly, but it does NOT separate every neighbouring pair — a gap that close is inside the model's own margin: refit it on either half of the record and pairs that close trade places. Treat anyone within about 1.5× of each other's power level as a tie.
It can also price a line-up nobody has ever played — it composes individual ratings instead of needing that exact five to have happened. That's the whole point: we never have to run a comp we all know is a walkover just to prove it was one.
Career Board
Everyone, same window. Tap a header to sort. ±EXP = win% minus the odds your teams had those nights (as-of-night ratings, draws = half a win) — the anti-"carried by a stacked comp" column. Win% is draws-neutral — wins ÷ (wins + losses), draws shown in the record but not held against you (Alan's motion, ratified 7/21). KDA · Solo/g · DMG/g · HEAL/g · TAKEN/g are here for full parity with Michael's board (his columns, our conventions) — the output columns average lobby-detail games only, so a brand-new night reads blank, never zero.
Powered by the public dataset (updated weekly) · queries run in your browser via SQLite-WASM — nothing leaves the page · conventions: bots excluded, win rates are draws-neutral (Alan's motion, 7/21) while ±EXP scores a draw as half a win vs the odds (Elo standard), records & ±EXP count every game the week it's played (best-source rows), and per-hero/per-10 panels use only games with full lobby detail (see the header count) · CTX/±EXP use as-of-that-night ratings from the Elo engine (odds.json) — a game's odds never change after the fact · 🏅 concept & first build: Michael · marvelgooners.com