Performance reference
Performance reference
CWV thresholds
| Metric | Good | Needs improvement | Poor |
|---|---|---|---|
| LCP | ≤ 2.5s | ≤ 4.0s | > 4.0s |
| CLS | ≤ 0.1 | ≤ 0.25 | > 0.25 |
| INP | ≤ 200ms | ≤ 500ms | > 500ms |
| FCP | ≤ 1.8s | ≤ 3.0s | > 3.0s |
| TTFB | ≤ 800ms | ≤ 1.8s | > 1.8s |
What Noibu MCP provides vs what needs Chrome
Noibu MCP (noibu_get_page_visits):
- p75 CWV scores per page/URL (LCP, CLS, INP, FCP, TTFB)
CLICKED_SELECTORS_WITH_COUNTS— CSS selectors + click counts per page (useful for INP: cross-reference most-clicked elements on a high-INP page to narrow down candidates)- Visual error count per page
Requires Chrome DevTools:
- The specific LCP element (tag, source, attributes)
- CLS shift sources (which elements are moving and by how much)
- The specific INP slow element selector and phase breakdown
The Noibu performance console shows element-level detail for INP (via the id= parameter in the console URL) but this is not exposed through the MCP tools — it requires navigating to the console in Chrome.
When Chrome isn't available: use CLICKED_SELECTORS_WITH_COUNTS as supporting context for INP, and fall back to pattern-based recommendations for LCP and CLS element identification.
DevTools diagnostics
Device emulation
Match emulation to where the issue is worst in Noibu data. Mobile emulation is required for mobile CWV findings — without it, CLS and LCP issues produce silent false negatives. Use a mid-range Android device with Fast 3G throttling. Always hard reload with cache disabled when measuring.
LCP
Use the Noibu recommend bucket to direct the investigation:
| Bucket | Where to look |
|---|---|
| TTFB | Server response time, CDN config, app/plugin overhead |
| Load Delay | Render-blocking scripts, missing preload hint, resource discovery order |
| Load Duration | Image file size, format (WebP vs JPEG), CDN delivery |
| Render Delay | JS blocking paint, lazy-loaded element, CSS blocking render |
Key check: is the LCP image in the initial HTML? Use View Source — not Inspect, which shows the post-JS DOM. If the image URL only appears after JS runs, the browser can't discover it early regardless of other optimisations.
CLS
Only shifts where hadRecentInput is false count toward CLS — filter accordingly.
Common causes in rough frequency order: images missing width/height, late-injected content (popovers, loyalty widgets, banners), carousels with no pre-JS height, font swap with large metrics difference, client-side rendered results grids injecting after paint.
INP
The dominant phase tells you where to dig:
| Dominant phase | Likely cause |
|---|---|
| Input Delay | Main thread busy at click time — third-party scripts initialising, carousels, analytics |
| Processing Time | Event handler too heavy — large re-renders, synchronous DOM queries, complex filter logic |
| Presentation Delay | Layout thrashing, large paint area, expensive animation |
If SVG sub-elements appear as separate tap targets in Noibu data, the fix is pointer-events: none on SVG children plus wrapping the SVG in a <button>.
Data-HTML mismatch
If Noibu shows a poor score but page inspection looks clean (no lazy hero, no missing dimensions, scripts deferred), the cause is likely runtime — server response time, slow CDN, or render-blocking JS execution that doesn't show in static HTML. Don't conclude "no issue found" from clean inspection alone.
Technical details fields
Rendered only when the operator explicitly asks or the Technical details chip is selected in the share widget. Render exactly these fields in order, omitting any with no data. No placeholder text, no commentary between fields.
- Score — one combined line:
[Metric] p75 [value] — [band] - Sub-metric breakdown — when available
- Affected element — CSS selector from Chrome inspection
- Detected anti-pattern — specific pattern found during page inspection
- Browser impact — when applicable
- OS impact — when applicable
- File/line — only when source enrichment ran