DotaGraph is an open-source, graph-first Dota 2 matchup project.
DotaGraph is built for ordinary players who want to answer two questions quickly during a draft: who counters this hero, and whom does this hero counter?
The public graph uses generated current-patch matchup statistics. The headline percentage is the real source hero win rate for the published OpenDota Ancient+ scope.
npm ci
npm run devQuality checks:
npm run typecheck
npm test
npm run build
npm run test:e2eGitHub Pages deployment uses a compiled Vite artifact. See docs/DEPLOYMENT.md for the required repository setting and deployment checks.
A -> Balways means A counters B.- Selecting a hero highlights 0–5 reliable incoming and 0–5 reliable outgoing relationships on the same graph.
- The displayed percentage is the source hero's matchup win rate.
- The current product scope contains heroes and hero-vs-hero counter relationships only.
- Headline scope is Ancient+ and the current patch supplied through data/configuration.
- Current matchup data is regenerated every 12 hours by GitHub Actions and published as static JSON.
Read AGENTS.md before contributing.
Interaction reference: https://claude.ai/public/artifacts/ddbdfd38-f9ac-4261-a764-cdbac4e405ec
The Claude artifact is an interaction reference only. DotaGraph has its own visual language.
DotaGraph now has a real current-patch data path.
For patch 7.41f:
- headline data comes from OpenDota
public_matches; - observation window begins at
2026-09-16T00:00:00Z; - headline scope is Ancient+ using
avg_rank_tier >= 60, ranked all-draft matches; - matchup details can show a separate OpenDota Immortal subset using
avg_rank_tier >= 80when matches are available; - a hero pair needs at least 500 qualifying matches;
- the displayed percentage is the raw source-hero matchup win rate;
- counter ordering uses the documented baseline-adjusted one-sided 95% lower confidence bound;
- the same eligible relationships drive deterministic offline graph geometry;
- generated data is refreshed every 12 hours through GitHub Actions;
- pipeline test/generation logs are uploaded as workflow artifacts;
- a successful data commit triggers normal CI, GitHub Pages deployment, and live Chromium verification.
The frontend fetches public/data/current-matchups.json at runtime and validates it before rendering. A snapshot older than 36 hours is still usable but is visibly marked stale.
Canonical sample-size semantics and counter-ranking methodology are documented in docs/METHODOLOGY.md.
Owner-approved direct Dota data sources are OpenDota, STRATZ, DOTABUFF, and Dota2ProTracker. OpenDota is currently the reproducible headline numeric source; the other sources remain available for compatible detailed/cross-source evidence under their documented access constraints.
Cross-source aggregation/disagreement rules are approved. Matchup details expose headline provenance and keep Immortal evidence in a separate population section. The next data work is adding compatible STRATZ/DOTABUFF/Dota2ProTracker observations where provider-compatible access is available.