Total Blocking Time (TBT)
TBT adds up how long the main thread was blocked by long tasks during page load, time in which a tap or keypress would have had to wait.
Count the blocking time yourself
Each block is a main-thread task. Anything over 50 ms is a long task; only the part beyond 50 ms counts as blocking (shaded). Adjust the task lengths, then split them up.
620 ms Total Blocking Time Poor
Same 915 ms of work either way. Only its shape changes.
This is why “break up long tasks” is the standard TBT and INP fix: the browser can respond to input between chunks. In code that means await scheduler.yield() (or a setTimeout fallback) inside loops, code-splitting, and moving work to a Web Worker.
The 50 ms rule
Any main-thread task longer than 50 ms is a long task. For each one between First Contentful Paint and Time to Interactive, Lighthouse counts only the part beyond 50 ms as blocking. A single 250 ms task adds 200 ms of TBT; five 50 ms tasks doing the same work add zero. The 50 ms budget comes from the RAIL model: respond to input within 100 ms, leaving half for the handler.
Why TBT matters so much
TBT carries the largest weight in the Lighthouse score (30%), and it is the lab proxy for Interaction to Next Paint, which can only be measured in the field. A high TBT in the lab usually predicts slow early interactions for real users on mid-range Android phones.
How to reduce TBT
- Ship less JavaScript. Code-split by route, remove unused dependencies, and check the “Reduce unused JavaScript” audit.
- Delay third parties. Load chat widgets, heatmaps and social embeds on interaction or after the page is idle.
- Break up long tasks. Yield with
scheduler.yield()orsetTimeout(0)inside loops and heavy initialisation. - Hydrate less. Islands, partial hydration and server components avoid running component code for static content.
- Move work off the main thread into Web Workers for parsing, sorting and data transformation.
Check it on your own page
Field and lab numbers for mobile and desktop, in about 30 seconds.
Questions people ask
What is a good Total Blocking Time?
Under 200 ms on a mobile Lighthouse run is good; over 600 ms is poor. Desktop thresholds are stricter (150 ms scores 0.9).
Is TBT a Core Web Vital?
No. It is a lab metric used as a proxy for Interaction to Next Paint, which is the responsiveness Core Web Vital.
Why is my TBT so much higher on mobile?
Lighthouse mobile simulates a CPU about four times slower than a typical desktop, so every JavaScript task takes longer and more of them cross the 50 ms line.