HTTP 103 Early Hints for Safer LCP Wins
Select stable LCP resources, prove the response path, compare field percentiles, watch wasted bytes, and roll back hints that hurt constrained users.
HTTP 103 Early Hints can start a stable LCP image, font, or stylesheet before the origin finishes the final response, but an early mistake also competes for scarce bandwidth sooner. This guide chooses each preload response header from trace evidence, validates the complete delivery path, and defines rollback before rollout.
HTTP 103 Early Hints targets origin think time
Map the navigation first: connection setup, request arrival, origin computation, final headers, HTML parse, resource discovery, response, decode, and paint. HTTP 103 Early Hints only create value when a critical resource can begin during meaningful server think time. If HTML arrives immediately or the browser already discovers the asset through another mechanism, a 103 may add complexity without visible gain.
Capture a production waterfall for representative cached and uncached visits. Identify the actual LCP element by route and viewport, not the asset the team assumes is important. The frontend observability guide helps attach field paint outcomes to route states rather than a laboratory screenshot.
Synthetic route fixture (not field or origin telemetry): assign 410 milliseconds of origin work, an 82 KB hero used on 96 percent of eligible responses, and an unhinted start at 486 milliseconds. The constructed gap is the teaching opportunity; a real analysis must measure connection and decode separately rather than crediting them to the informational response.
- 103: Hint
- Preload: Start
- 200: Confirm
- LCP: Paint
Hint only stable critical resources
A good candidate is needed on most responses for the route, safe to fetch before authentication-dependent HTML resolves, cacheable under the same credentials policy, and expensive enough that earlier discovery matters. Common candidates are a hero image with a stable URL, the critical stylesheet, or a carefully selected font. A 103 preload should not guess among personalized images or responsive variants with weak evidence.
Create a hint manifest per route with URL, as type, crossorigin mode, expected use rate, size, cache policy, and owner. HTTP 103 Early Hints should be generated from that allowlist, not from arbitrary application headers. Start with one resource; early bandwidth is a product budget, not a prize for every asset.
Synthetic hint manifest (not route inventory data): accept only /media/hero-v7.avif with as=image, anonymous mode, 82,104 example bytes, public immutable caching, and owner web-performance. Assign a font 61-percent fixture coverage and exclude a secondary illustration from LCP, so the expected allowlist emits one Link value rather than three speculative fetches.
Match preload identity exactly
The hinted Link must match the later request in URL, destination, CORS mode, credentials, and relevant type information so the browser can reuse it. A font preload without the correct crossorigin attribute may trigger a second fetch. A responsive image can be especially difficult when the final choice depends on viewport and source selection.
The MDN 103 Early Hints reference documents the status and common Link usage. HTTP 103 Early Hints are informational; the final response still carries authoritative headers and content. Verify reuse in browser developer tools and server logs instead of assuming the matching text looks close enough.
Synthetic protocol fixture (not a packet capture): the paired exchange begins “HTTP/1.1 103 Early Hints” with “Link: </media/hero-v7.avif>; rel=preload; as=image”, followed by a constructed 397-millisecond delay and “HTTP/1.1 200 OK” with HTML referencing that exact URL. The expected assertion is one request identity initiated by early hints and reused by the image element without a duplicate transfer.
Prove the CDN and origin response chain
Confirm that the origin or edge can emit an informational response, the CDN forwards or generates it, TLS and HTTP versions support the path, and no proxy converts it into a final response. Test redirects, cache hits, cache misses, errors, bot traffic, and authenticated routes. Preserve final Link headers where ordinary preload fallback is still desired.
RFC 8297 defines the 103 status and its security considerations. HTTP 103 Early Hints must never reveal a resource whose existence is sensitive before the final authorization decision. Keep personalized identifiers, private object paths, experiment membership, and user-specific domains out of early metadata.
Synthetic delivery matrix (not a deployed replay): define origin, staging CDN, and edge-cache cases that must preserve 103 before 200 on a cache miss, with the same allowlisted hint expected on a cache hit. Redirect and 403 fixtures expect no informational response. A future header capture must verify that no user identifier or experiment variant enters the early block; this article does not claim that capture already exists.
| Candidate | Coverage | Waste risk | Verdict |
|---|---|---|---|
| Hero image | High | Medium | Experiment |
| All fonts | Mixed | High | Reject |
| Critical CSS | High | Low | Measure |
Design an experiment around field LCP
Randomize eligible traffic at the delivery layer and keep the HTML treatment identical. Compare LCP p50 and p75, time to first byte, resource start, resource completion, bytes transferred before final headers, and abandonment. Segment by effective connection type, cache state, viewport, route, and device class with minimum sample sizes.
Lab traces explain the mechanism; field data decides whether users benefited. Early Hints LCP wins can vanish for warm caches or turn negative on slow connections when a guessed image blocks more useful CSS. HTTP 103 Early Hints should ship only when confidence intervals support a practical improvement and guardrail regressions remain below the predeclared limit.
Synthetic experiment fixture (not exposure or field data): assign 10-percent treatment, cold-cache LCP p75 values of 2,680 and 2,410 milliseconds, and a 331-millisecond earlier hero start. Construct warm-cache results with no material change and a constrained-3G 95-percent interval crossing zero. The expected decision excludes that cohort instead of averaging it into a headline result.
Count wasted and duplicate work
Measure hints that were not used, requests issued twice, bytes abandoned after navigation, and resources downloaded before an error or redirect. Track cache hit rate and reuse reason where tooling allows it. A fast LCP for one cohort does not justify large waste for another, especially on metered networks.
Fonts deserve care: subset by actual language coverage, keep fallback typography stable, and compare with the variable font responsive type guidance before promoting a large file. HTTP 103 Early Hints may move a download earlier, but it does not make the payload free or prevent layout shift caused by poor font metrics.
Synthetic waste fixture (not navigation telemetry): define 50,000 treatment navigations, 1,870 unused hints, 27.6 MB transferred before cancellation, and a 0.03-percent duplicate rate caused by an intentionally missing crossorigin value. The example diagnosis prioritizes fixing the template over celebrating a median start-time gain; actual rollout requires its own trace evidence.
Set rollback thresholds before exposure
Define automatic or one-click rollback when LCP p75 regresses, unused preload rate exceeds a limit, duplicate request rate rises, origin or edge errors change, or transferred bytes increase beyond budget for constrained cohorts. Keep the no-hint response path continuously tested. A config flag should remove the 103 without requiring an application deploy.
Review guardrails daily during ramp and retain treatment assignment in telemetry. LCP optimization can be noisy, so avoid reacting to one hour while also refusing to average away a clear harm cohort. HTTP 103 Early Hints need a named owner who can stop exposure when the resource identity or delivery behavior no longer matches the manifest.
Synthetic rollback policy (not live telemetry): disable hints if LCP p75 worsens by 75 milliseconds for two evaluation windows, unused-hint rate exceeds 8 percent, duplicate rate exceeds 0.2 percent, or wasted bytes exceed 1.5 KB per eligible navigation. Illustrative below-threshold inputs are −270 milliseconds, 3.74 percent, 0.03 percent, and 552 bytes; they demonstrate policy evaluation and must not be read as deployment results.
Run the bounded teaching fixture before adapting the pattern to production.
Runnable artifact — early-hints-candidate.test.mjs
import assert from "node:assert/strict";const candidates=[{url:"/hero.avif",coverage:.96,private:false,bytes:82000},{url:"/user/42.png",coverage:.42,private:true,bytes:22000}];const hints=candidates.filter(x=>x.coverage>=.9&&!x.private&&x.bytes<100000).map(x=>x.url);assert.deepEqual(hints,["/hero.avif"]);console.log("PASS: only stable high-coverage assets are hinted");
Run node early-hints-candidate.test.mjs. Expected receipt: PASS: only stable high-coverage assets are hinted.
Test route variation and responsive content
Render narrow, wide, high-density, dark, localized, signed-in, signed-out, and error states. A responsive hero may use different crops; a route may replace the LCP element after personalization. The responsive content fixture keeps those cases visible, while CSS responsive shape art offers a route that may avoid an image preload entirely.
For each case, assert that a hinted resource is consumed once or intentionally ignored within budget. HTTP 103 Early Hints should fail toward ordinary discovery. A stale manifest must not break rendering, and an unsupported browser must receive the same final document.
Synthetic variation fixture (not browser or telemetry results): expect dark-theme and high-density cases to reuse the same URL, while a narrow signed-out case selects a smaller source and remains excluded pending evidence. A stale v6 manifest should lead to ordinary v7 discovery after HTML parse, keep the page correct, and mark the constructed early transfer unused in generated test output.
- 1Trace
Find server think time
- 2Allowlist
Choose one stable asset
- 3Experiment
Measure field percentiles
- 4Rollback
Honor guardrail limits
Keep a preload evidence ledger
Record route, hinted asset, response coverage, final request match, browser matrix, field treatment dates, LCP effect, unused rate, transferred-byte effect, security review, and rollback threshold. Schedule removal when the hero, stylesheet graph, font, CDN, or server-rendering latency changes. General implementation guidance can explain the mechanism, while your ledger remains the product-specific proof.
HTTP 103 Early Hints are successful when one stable critical dependency starts materially earlier for the users who need it, the final response remains authoritative, and the team can remove the hint safely. An impressive waterfall without field improvement or waste accounting is not a performance win.
Proposed evidence ledger (not an existing operational record): require generated header blocks, request-reuse ID, eligible-cohort query, analysis notebook, synthetic 27.6 MB waste value, guardrail fields, CDN configuration hash, and kill-switch owner. Replacing hero-v7 should invalidate the row so an operator can review measured benefit, cost, stop conditions, and accountable ownership.