itemize.lol

Which build hits harder?

League of Legends has 173 characters, each with hundreds of ways to equip them. Players argue about the best one forever, because the game never tells you the number that would settle it. This site works that number out.A theorycrafting site whose real work is the data: a pipeline compiles the game's own files into formula trees each patch, hand-written models say how those formulas become damage, and an engine simulates the fight. TypeScript, Hono, Cloudflare Workers.

The itemize.lol workbench comparing two Kai'Sa builds

The real engine, right here

13
2,400
80
50
A

–

    B

    –

      Every number comes from itemize.lol's live API, patch 26.21, as you move a slider.

      The number doesn't exist

      You would think the damage of an ability is written down somewhere. It isn't. Three places each hold a piece of it.No public source gives real ability damage. Each has part of it, so the dataset is built in three layers, each doing only what it is reliable for.

      Data Dragon

      Riot's official feed

      Has Names, icons, prices, tooltip templates.

      Lacks Every formula. Sometimes it is simply wrong: one patch listed attack damage per level as 0 for 172 of 173 champions.

      Game files

      mirrored by Community Dragon

      Has The real formulas, per-rank values, base stats.

      Lacks How the formulas combine.

      The wiki

      written by people

      Has Hit counts.

      Lacks Currency. Its Samira numbers were a balance pass behind when this was built.

      Samira's ultimate fires ten shots.

      The game's data describes one. The ten appears only in the sentence a player reads. A person has to notice that and write it down, for 865 abilities, without ever typing in a number that the next patch will change.The game data has one calculation, DamageCalc: a single shot. That she fires ten is only in the tooltip's prose. Models name calculations and never contain game numbers, so balance patches flow through on the next build.

      r: {
        hits: [{
          id: 'shots', type: 'physical',
          amount: 'DamageCalc',
          count: 10, over: 2,
          crit: 'CriticalDamageCalc',
        }],
      },

      src/models/champions/Samira.ts

      It tells you what it doesn't know

      A wrong number that looks right is the worst thing a calculator can give you. So every ability carries a label saying how far to trust it, and "verified" is still at zero, because nobody has checked these against the live game yet.Every ability and item carries a status, returned by the API and shown in the UI. Models are fingerprinted against the spell's shape, so a rework marks them stale. A model naming a calculation the patch no longer has fails to bind and falls back: it can never silently read zero. Anchors stop the build if the stat codes get renumbered.

      Live coverage for patch 26.21: 865 abilities and passives, 173 champions.

      A new patch ships by itself

      League changes every two weeks. Every three hours this site checks, and if there's a new patch it rebuilds itself and goes live. I find out from an issue, and only if something needs a person.A scheduled GitHub Action runs the whole update every three hours. It also builds a preview from Riot's test server, keeps the previous patch beside the live one, and opens an issue with exactly what a person has to look at when a model stops binding or an anchor fails.

      1. Ask Riot for the newest patch
      2. Mirror the game files
      3. Compile every formula
      4. Bind the models
      5. Check the canaries
      6. Run the tests
      7. Commit and deploy