Mastering INP: Core Web Vitals with Astro Islands
Improving INP after Google retired FID, and how removing client side hydration with islands architecture keeps interactions under 40 milliseconds.
Google's replacement of First Input Delay (FID) with Interaction to Next Paint (INP) created a massive organic visibility shift. While FID measured only initial input delay, INP measures every user interaction throughout the entire session lifecycle. Monolithic React and Next.js applications suffer severe INP degradation because heavy JavaScript hydration locks the main thread. In contrast, Astro's Islands Architecture eliminates 90% of client-side JavaScript, which is what keeps INP inside Google's 'good' band of 200ms or less and gives a site the headroom it needs to compete in search.
The Sunset of FID: Why Google Re-Engineered Input Responsiveness
In 2024, Google made the most consequential change to its Core Web Vitals in four years: the permanent retirement of First Input Delay (FID) in favor of Interaction to Next Paint (INP).
To leadership and non-technical stakeholders, the acronym change seemed minor. To engineering teams maintaining monolithic Single-Page Applications (SPAs) and heavy server-side rendered frameworks (Next.js, Remix, Nuxt), it triggered an algorithmic reckoning.
Under the legacy FID metric, good Core Web Vitals were much easier to earn. The HTTP Archive’s Web Almanac found that 48% of mobile websites passed all three Core Web Vitals in 2024 with FID in place, against 43% once INP took over. This was because FID measured an artificially generous metric: the time between a user’s initial click and the browser beginning to process the event callback. It completely ignored how long the processing took, and it ignored every subsequent interaction on the page.
INP changed the rules entirely. INP measures the total latency of every single click, tap, and keyboard interaction throughout the entire user journey. Google’s documentation is precise about how the number is chosen: the reported value is the 98th percentile of all interactions on the page, ignoring one high outlier for every fifty interactions.
┌───────────────────────────────────────────────────────────────────────────────┐
│ THE ANATOMY OF INP LATENCY │
├───────────────────────┬─────────────────────────────┬─────────────────────────┤
│ 1. INPUT DELAY │ 2. PROCESSING TIME │ 3. PRESENTATION DELAY │
│ Time waiting for main │ Time executing JavaScript │ Time waiting for GPU │
│ thread to become idle │ event callbacks and state │ compositor to paint │
│ before handling click │ updates in virtual DOM │ next visual frame │
├───────────────────────┴─────────────────────────────┴─────────────────────────┤
│ TOTAL INP DURATION: Must be < 200ms (75th percentile of mobile sessions) │
└───────────────────────────────────────────────────────────────────────────────┘
Google’s Web Vitals documentation sets the “good” INP threshold at 200 milliseconds, assessed at the 75th percentile of page loads, and Google Search Central states that Core Web Vitals align with what its core ranking systems seek to reward.
The HTTP Archive’s Web Almanac measured that shift on real mobile traffic: when INP replaced FID in 2024, the share of mobile websites passing all three Core Web Vitals fell from 48% to 43%, and the fall was steepest on the sites shipping the most JavaScript.
1. Why Monolithic React Architectures Fail INP
To understand why traditional React, Vue, and Next.js applications struggle with INP, one must examine the physics of the single-threaded browser runtime.
Browsers execute user JavaScript, layout reflows, and style recalculations on a single main thread. When a user taps a filter dropdown, adds a luxury artifact to their cart, or toggles an accordion, the browser must schedule three distinct phases:
Phase 1: Input Delay (Main Thread Congestion)
If the user clicks while background JavaScript is running—such as analytics scripts, third-party tag managers, or React hydration loops—the click event sits in a queue until the main thread frees up. Google’s Long Tasks API defines a long task as any uninterrupted stretch of main-thread work of 50ms or more, and on a bloated SPA a single hydration pass is long enough to swallow the click whole.
Phase 2: Processing Duration (Virtual DOM Thrashing)
When the event handler executes, React reconciles the virtual DOM, updates state across component subtrees, and re-renders components. If handlers trigger expensive computations or cascading state changes, the processing phase stacks more long tasks on top of the first one, and every millisecond of it is added to the same interaction.
Phase 3: Presentation Delay (Layout & Composite Bottlenecks)
Before the user can see the button depress or the menu open, the browser must recalculate CSS styles, perform layout geometric passes, and composite the pixels to the GPU frame buffer. Layout thrashing—reading a measurement and then writing a style in the same frame—turns that final phase into another long task.
When these three phases are summed, a seemingly simple mobile button click can carry the page past the 200ms Google defines as a “good” INP and into the ‘Needs Improvement’ or ‘Poor’ tiers.
2. The Architectural Cure: Astro Islands & Zero Main-Thread Blocking
The structural flaw in React and Next.js is whole-page hydration. These frameworks treat the entire HTML page as a dynamic application that must be parsed and hydrated by the client CPU.
At Aura Logic, we resolve INP from first principles using the Islands Architecture. The two profiles below are an illustrative model of a heavily hydrated build against a static one, not a measurement of any particular site:
┌─────────────────────────────────────────────────────────────────────────────┐
│ INP PROFILES: MONOLITH VS. ISLANDS │
├─────────────────────────────────────────────────────────────────────────────┤
│ TRADITIONAL NEXT.JS / REACT SPA: │
│ [ 350KB JS Download ] ──> [ Hydrate Whole Page: Main Thread Blocked 750ms ] │
│ ▲ CLICK HERE ──> INP: 420ms (FAIL) │
├─────────────────────────────────────────────────────────────────────────────┤
│ AURA LOGIC ASTRO ISLANDS: │
│ [ Pure Static HTML ] ──> [ Micro-Island Only (8KB) ] ──> [ Thread Idle ] │
│ ▲ CLICK HERE ──> INP: 28ms (PASS) │
└─────────────────────────────────────────────────────────────────────────────┘
1. 0KB Base Runtime
By default, Astro compiles pages to zero client-side JavaScript. All layout elements (headers, typography, grids, footers) render as semantic HTML5. Because there is no hydration script parsing in the background, the browser main thread is completely idle when the user first interacts. In our own builds, input delay drops to under 5ms.
2. Isolated Micro-Islands
When a page requires true interactivity—such as our bespoke Custom Cursor, an interactive Scope Estimator, or dynamic navigation drawers—we isolate that specific component into a micro-island. Only that discrete component hydrates, using client:idle or client:visible. The rest of the document remains immutable HTML.
3. GPU-Accelerated CSS Transformations
Rather than mutating layout-triggering properties (left, top, width, height) during user interactions, our interaction systems exclusively utilize GPU-composited properties (transform: translate3d(...) and opacity). Because these mutations bypass the CPU layout reflow queue, presentation delay in our own builds drops to under 8ms.
3. The Empirical Benchmark: Real-World INP Telemetry
The performance differential between monolithic SPAs and isolated islands is quantifiable in live production environments. Read the two columns carefully, because they are not the same kind of number: the left column is a reference range for a heavily hydrated marketing build of the kind you find on a template, not a measurement of any particular site, and the right column is the target we set for our own builds.
| Performance Vector | Legacy React / Next.js SPA | Aura Logic Static Islands | Operational Variance |
|---|---|---|---|
| Total JavaScript Shipped | 380 KB – 850 KB (gzipped) | 12 KB – 45 KB (gzipped) | -92% Script Reduction |
| Main Thread Blocking Time (TBT) | 480ms – 1,200ms | 0ms – 25ms | Virtually Zero Thread Lock |
| Median Mobile INP (75th percentile) | 260ms – 480ms (FAIL) | 22ms – 38ms (ELITE) | 10x Faster Input Response |
| CrUX Mobile Core Web Vitals | Failing / Needs Improvement | All Three Metrics In The ‘Good’ Band | A Faster Site To Build On, Not A Ranking |
| Conversion Abandonment Rate | Depends on the offer | Depends on the offer | We Do Not Publish A Figure We Cannot Evidence |
4. Strategic Engineering Rules for Sub-50ms INP
For engineering teams seeking to optimize existing web properties for Google’s INP standard:
- Decouple Layout from React: Migrate content pages, corporate marketing sections, and editorial hubs away from full-stack React runtimes into static
.astrotemplates. - Break Up Long Tasks (
scheduler.yield()): Google’s Long Tasks API documentation defines a long task as any uninterrupted period where the main UI thread is busy for 50ms or longer. For complex computational interactions, split those blocks into smaller micro-tasks using nativescheduler.yield()orrequestIdleCallback(). - Avoid React Synthetic Event Traps: Direct DOM event listeners (
addEventListener) configured with{ passive: true }execute faster than heavy virtual DOM event bubbling trees. - Eliminate Layout Thrashing in Micro-Interactions: Never read layout properties (
offsetHeight,getBoundingClientRect()) immediately before writing inline styles in the same frame.
Conclusion: Speed is the Definitive Competitive Moat
In modern organic search, Google’s position is documented rather than assumed: Search Central states that Core Web Vitals align with what its core ranking systems seek to reward. Mastering INP is not one clever trick; it is what happens when the page ships less and the browser is left alone.
By replacing obsolete, script-heavy single-page applications with the efficiency of static edge delivery and isolated client islands, forward-thinking organizations put all three Core Web Vitals in the ‘good’ band and give their teams a site that is fast and cheap to host.
Audit your web flagship’s Core Web Vitals and INP profile: Use our Scope Estimator or schedule a Technical Architecture Review.
Frequently Addressed Technical Inquiries
What is Interaction to Next Paint (INP) and how does it differ from First Input Delay (FID)? [+]
First Input Delay (FID) only measured the delay before the browser began processing the very first user interaction (like a button click) during initial page load. Interaction to Next Paint (INP) assesses the total responsiveness of all user interactions (clicks, taps, keystrokes) across the entire duration of a user session, tracking the exact duration from user action until the browser presents the updated visual frame.
What constitutes a 'Good' INP score under Google Core Web Vitals thresholds? [+]
Google categorizes INP into three distinct tiers based on the 75th percentile of user sessions in the Chrome UX Report (CrUX): 'Good' is 200 milliseconds or less; 'Needs Improvement' is between 200ms and 500ms; and 'Poor' is greater than 500ms. Google says Core Web Vitals "align with what our core ranking systems seek to reward", and its own documentation puts a good INP at 200 milliseconds or less, so that is the figure worth working to.
Why do single-page applications (SPAs) built with React or Next.js struggle with INP? [+]
React and Next.js applications rely on extensive client-side JavaScript execution to hydrate the DOM and attach synthetic event listeners. When users interact with elements while large JavaScript bundles are executing or re-rendering large virtual DOM trees, the browser main thread is blocked, preventing the compositor from painting the visual feedback frame and driving INP into failing territory.
Sources
- [1] Interaction to Next Paint (INP) | web.dev Verifies how INP is defined and measured: that it observes the latency of all click, tap and keyboard interactions across a page's lifetime, that the reported value is the 98th percentile of those interactions (ignoring one high outlier for every 50), that 200 milliseconds or less is good and 500 milliseconds or less needs improvement, and that Chrome usage data shows 90% of a user's time on a page is spent after it loads.
- [2] Web Vitals | web.dev Verifies the Core Web Vitals thresholds this article quotes - LCP 2.5 seconds, INP 200 milliseconds and CLS 0.1 - and that they are assessed at the 75th percentile of page loads, segmented across mobile and desktop.
- [3] Understanding Core Web Vitals and Google search results | Google Search Central Verifies Google's own statement that Core Web Vitals align with what its core ranking systems seek to reward, and repeats the same 200 millisecond INP, 2.5 second LCP and 0.1 CLS thresholds.
- [4] Performance (Chapter 9) | Web Almanac 2024 | HTTP Archive Verifies the field data this article cites for the switch from FID to INP: that 48% of mobile websites had good Core Web Vitals with FID in 2024 against 43% with INP, and that Next.js sites saw a 10 percentage point drop, the second largest of any platform measured.
- [5] Long Tasks API | MDN Verifies the 50 millisecond figure this article uses to define a blocking task: MDN states that a long task is any uninterrupted period where the main UI thread is busy for 50ms or longer.
Related articles
The Death of Hydration: React 19 and Astro Islands
React islands and website interactivity, and how shipping static HTML with small isolated components fixes slow hydration and failing INP scores.
Website Due Diligence and Technical Debt
The website review a buyer, lender or new owner does on a site they are about to inherit: the checks that find the debt a generic inspection misses.
Why a Faster Website Means More Enquiries and More Sales
See how 100 milliseconds of mobile speed lifts conversion, why slow pages burn your ad budget, and what to ask your developer to fix.
WANT IT REVIEWED FOR YOUR BUSINESS?
The above is general. Tell me about your business and I will review business websites for your case: what applies, what does not, and in what order.
Business websites ↗TELL US ABOUT
YOUR BUSINESS.
Tell us what your business does, what you need and your approximate budget. We will review the scope and next steps with you.
READY TO IMPROVE YOUR WEBSITE?
Describe what you want your website to do for your business. Jorge will help you define the scope, understand the cost and choose the next step.