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
Friday customs 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-minute rates while actually playing the role — from role-pure games (≥90% of that match on the role's heroes; swapping healers mid-game still counts, so flex healers get full credit). SCORE ranks the whole job, weighted by the lobby's own council ruling (GC, 7/21) — DPS: final hits 30 · kills 30 · damage 30 · deaths −10 (deaths mostly price themselves into your per-minute rates — Michael's law). Tank: absorbed 35 · kills 15 · damage 15 · assists 10 · deaths −25 (absorb dominates but dying leaves the line unheld). Healer: heals 35 · assists 25 · kills 5 · deaths −35 (every death is one less piston — Ice's law). Footnote: we tested the game's own MVP/SVP picks (994 awards in our db) as an alternative authority — the game turns out to crown kills and final hits in EVERY role, healers included. Highlight-reel logic; deliberately not adopted. 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 whole record · 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 and is history. Anyone under ${STRENGTH.minRecent || 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 — Ice is #1 — but it does NOT separate every neighbouring pair. Michael and Kyle sit 49 points apart, which is inside the model's own margin: refit it on either half of the record and pairs that close trade places. Treat a gap smaller than the 90% range 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 have full lobby detail on all 629 customs — the 7/27 night included · 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