103 - Early Hints
HTTP 103 Early Hints is an informational response sent by the server before the final status code. It contains Link headers that allow browsers to begin preloading critical resources-like CSS, JavaScript, and Fonts-while the server is still processing the main request.
Last reviewed: March 10, 2026|Editorial standard: source-backed technical guidance
What Does Early Hints Mean?
103 Early Hints solves the "Server Think Time" bottleneck. In standard HTTP, the browser waits idly while the server generates a response (e.g., database queries). With 103, the server sends a "hint" immediately, telling the browser which files it will eventually need. This allows the browser to utilize idle network time to download render-blocking assets, significantly improving perceived performance.
Common Causes
- -Proxy Buffering: Reverse proxies (Nginx, Cloudflare) buffering the entire response, causing the 103 and 200 to arrive at the same time, which completely negates the benefit.
- -HTTP/1.1 Limitations: Attempting to use Early Hints over HTTP/1.1; while theoretically possible, it is most effective and widely supported over HTTP/2 and HTTP/3.
- -Redundant Preloads: Hinting resources that are already in the browser cache, which wastes connection slots and can actually delay the main document.
- -CORS Mismatches: Hinting cross-origin resources (like Google Fonts) without the
crossoriginattribute, causing the browser to discard the preloaded asset and fetch it again.
How to Fix Early Hints
- 1Disable Proxy Buffering: Ensure
proxy_buffering off;is set in Nginx for specific routes to allow the 103 frame to be flushed immediately. - 2Selective Hinting: Only hint 2-3 truly critical, render-blocking resources (e.g., main CSS and the hero image) to avoid saturating the connection.
- 3Verify CDN Support: Confirm that your CDN (like Cloudflare) is configured to pass through 1xx informational responses to the end user.
- 4Use HTTP/2+: Ensure your environment is fully upgraded to HTTP/2 or HTTP/3 to handle interim responses efficiently.
Step-by-Step Diagnosis for Early Hints
- 1Confirm the 103 response arrives before the 200 using
curl --http2 -v. You should see two status headers. - 2Examine the Chrome DevTools Network waterfall: preloaded resources should show a start time earlier than the main HTML document's finish time.
- 3Check for double-fetching in the network tab; if a resource is listed twice, there is likely a CORS or URL mismatch in your Link header.
- 4Measure "Server Think Time" (Time to First Byte) vs. "Time to First Paint" to see if 103 is actually closing the gap.
Comparison: 103 Early Hints vs. Server Push
- -103 Early Hints: Browser maintains control; it decides whether to fetch based on its cache. (Recommended & Modern).
- -HTTP/2 Server Push: Server forces files onto the browser. Deprecated in most browsers due to complexity and cache-awareness issues.
Infrastructure & Proxy Flush Audit
- -Nginx Config: Both
proxy_bufferingandfastcgi_bufferingmust be set toofffor the 103 status to reach the client early. - -Content-Encoding: Ensure that early flushes are not blocked by Gzip or Brotli compression layers that require a full buffer.
Implementation Examples
location / {
proxy_pass http://backend_upstream;
proxy_buffering off; # Critical for Early Hints
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}const http2 = require('http2');
const server = http2.createSecureServer(options);
server.on('stream', (stream) => {
// Send Early Hints before expensive database call
stream.additionalHeaders({
':status': 103,
'link': '</style.css>; rel=preload; as=style'
});
// Final response after processing
setTimeout(() => {
stream.respond({ ':status': 200, 'content-type': 'text/html' });
stream.end('<html>...</html>');
}, 1000);
});How to Verify the Fix
- -Observe the "HTTP/2 103" status frame appearing in
curlbefore the "HTTP/2 200". - -Verify Largest Contentful Paint (LCP) improvements in Lighthouse or PageSpeed Insights.
- -Ensure the browser does not report "Preload noticed but not used" in the console.
How to Prevent Recurrence
- -Critical Path Audit: Regularly review which assets are hinted; as your CSS/JS bundles change, your Early Hints should be updated.
- -Monitoring LCP: Track LCP via Real User Monitoring (RUM) to ensure 103 configuration remains optimal across different network conditions.
- -CI/CD Validation: Add a step to your deployment pipeline to verify that 103 headers are correctly formatted and point to valid, CORS-compliant URLs.
- -Pro-tip: Link headers in 103 should exactly match the final headers in the 200 response to ensure the browser identifies them as the same resource.
Decision Support
Official References
Provider Context
This guidance is specific to HTTP services. Always validate implementation details against official provider documentation before deploying to production.