• v3.15.0 57c216117c

    v3.15.0 Stable

    joeyr released this 2026-08-04 22:44:22 -05:00 | 18 commits to main since this release

    Changed

    Item builds now come from Riot match data instead of a live op.gg scrape.

    Locking in a champion no longer fetches an op.gg page. The list is read out of champion-builds.json, which the sibling crawler builds nightly by replaying Riot match timelines and counting what players actually bought.

    What that takes out of champ select: a page fetch through the shared rate limiter against a draft timer, a 10-second timeout, and a scraper that balanced-bracket scanned a JSON literal out of op.gg's RSC payload and broke whenever they redeployed their frontend. adapters/op-gg-items.ts is deleted.

    No fallback behind it, unlike every other artifact

    Runes and counters short-circuit a scraper that measures the same op.gg numbers, so a miss there costs only latency. Items are not comparable: op.gg published its aggregation of its sample, this counts Riot's timelines. Keeping both would mean the Import button sometimes writing a build measured over a different population than the win rate displayed next to it.

    So the scraper is gone rather than demoted. ItemOptionsProvider is a synchronous map lookup with no rate limiter, timeout or failure path; the item-options message goes straight to ready; and every miss — no artifact yet, off-patch, champion unseen at that role — collapses to an empty list with one line explaining it, because none of them is worth retrying at the user's expense.

    Three samples, one item set

    The four blocks an import writes are drawn from measurements of different sizes: starter items and the core sequence from the sampled timelines, boots from every recorded match, and situational from order.late — the items measured as bought after the core, which is the field added upstream in v0.21.0 for exactly this.

    Only the core row's win rate, pick rate and games reach the card, and all three are measured over the same sample.

    Rows are no longer re-sorted or floored. op.gg needed a 50-game floor because its page mixed in rows it had surfaced by win rate, where a three-game Mejai's build could outrank a real one. These rows are ranked by how often the build was actually assembled.

    Names come from the artifact

    Item names and icons are published alongside the ids, pinned to the exact Data Dragon version those ids were classified under (lol-companion-data v0.22.0). The bundled extract in src/shared/item-costs/ remains the overlay's gold table — resolving names against it would let them drift from the ids they describe every time Riot renames an item.

    Fixed

    • The Item Import section said nothing at all when there were no builds to show. It now explains why, and no longer offers a spinner for a lookup that cannot take any time.

    Gate green: typecheck, lint, 966 tests across 96 files, build.

    Downloads