Total Blocking Time (TBT)

A lab score summing every millisecond past 50ms that the page spent too busy to answer a click while loading.

how long the page is frozen in a testtotal time it can't respondTBTthe lighthouse score that keeps tankingblocked time metrictotal block timehow unresponsive is my page during load

See it

Live demo coming soon

What it is

Total Blocking Time adds up how long the main thread was too busy to respond during page load. The recipe: take every long task between First Contentful Paint and Time to Interactive, subtract the free 50ms from each, and sum what's left. Three tasks of 80ms, 120ms, and 200ms give a TBT of 30 + 70 + 150 = 250ms. Lighthouse weights it heavily, which is why a beautiful page with a fat bundle scores in the fifties.

Reach for TBT when you need a lab number you can put in CI. INP is the metric users actually feel, but INP is measured in the field and needs real traffic before it tells you anything. TBT is the reproducible stand-in: it moves in the same direction, it moves on every build, and it will fail a pull request before your users notice.

Two traps. First, TBT only covers the load window, so it says nothing about a slow filter three clicks in; a green TBT with a red INP is a normal and confusing outcome. Second, it is exquisitely sensitive to the throttling settings of the test machine, so only compare runs from the same harness and treat single-run numbers as noise.

Ask AI for it

Reduce Total Blocking Time for this app. Run Lighthouse in lab mode with mobile CPU throttling and record the current TBT and the top three long tasks in the main-thread breakdown. Then attack the causes: code-split routes and heavy dependencies behind dynamic imports, remove or defer third-party scripts until after load, chunk any startup work into yielding batches, and move pure computation to a Web Worker. Re-run the same Lighthouse config three times, report median TBT before and after, and add a TBT ceiling as a CI assertion.

You might have meant

long taskmain thread blockinginteraction to next paintcore web vitalslab data vs field data