Click Below to Get the Code

Browse, clone, and build from real-world templates powered by Harper.
Tutorial
GitHub Logo

Resource Hints Explained | Preload, Preconnect, and Early Hints

Discover how resource hints like preload, preconnect, and Early Hints can dramatically boost web performance. Learn how each hint impacts key metrics like LCP and TTFB, with practical examples and implementation strategies to speed up page load and enhance user experience.
Tutorial

Resource Hints Explained | Preload, Preconnect, and Early Hints

Joseph Yoo
Forward Deployed Engineer
at Harper
June 4, 2025
Joseph Yoo
Forward Deployed Engineer
at Harper
June 4, 2025
Joseph Yoo
Forward Deployed Engineer
at Harper
June 4, 2025
June 4, 2025
Discover how resource hints like preload, preconnect, and Early Hints can dramatically boost web performance. Learn how each hint impacts key metrics like LCP and TTFB, with practical examples and implementation strategies to speed up page load and enhance user experience.
Joseph Yoo
Forward Deployed Engineer

Resource hints like preload, preconnect, and early hints are essential tools for improving web performance, particularly when optimizing for metrics like LCP (Largest Contentful Paint) and TTFB (Time to First Byte). In this article, we walk through real-world examples, demonstrating the measurable impact of each hint.

Baseline: No Resource Hint

HTML File: no-preload.html
JavaScript File: loader.js

This setup loads an HTML file, which loads a JavaScript file, which then loads an image. Each step incurs its own latency.

<!-- no-preload.html -->
<html>
  <head></head>
  <body>
    <script src="../javascript/loader.js"></script>
  </body>
</html>

// loader.js
const img = new Image();
img.src = "../images/background.png";
document.body.appendChild(img);

Impact: Each asset waits for the previous to load before it begins, compounding latency.

Client-Side Preload

HTML File: client-preload.html

By adding a <link rel="preload"> tag, we instruct the browser to fetch the image early—even before the JS requests it.

<link rel="preload" as="image" href="../images/background.png" />
<script src="../javascript/loader.js"></script>

Impact: The browser downloads the image in parallel with the JS file, saving one round-trip time.

Early Hints Preload

HTML File: eh-preload.html

This version moves the preload hint to the server using an HTTP 103 Early Hints response:

HTTP/1.1 103 Early Hints
Link: </images/background.png>; rel=preload; as=image

HTTP/1.1 200 OK
Content-Type: text/html

Impact: Resources start loading before the full response even arrives, outperforming client-side preload.

Client-Side Preconnect

HTML File: client-preconnect.html
JavaScript File: cdn-loader.js

In cases where only the domain of a resource is known, use preconnect:

<link rel="preconnect" href="https://cdn.example.com" />
<script src="https://cdn.example.com/cdn-loader.js"></script>
// cdn-loader.js
const img = new Image();
img.src = "https://img.example.com/background.png";
document.body.appendChild(img);

Impact: Reduces DNS, TCP, and TLS setup times for third-party resources, typically saving 100–300ms.

Early Hints Preconnect

HTML File: eh-preconnect.html

Move the preconnect instruction to the server to get the benefits even earlier:

HTTP/1.1 103 Early Hints
Link: <https://cdn.example.com>; rel=preconnect
Link: <https://img.example.com>; rel=preconnect

HTTP/1.1 200 OK

Impact: Provides the most aggressive latency reduction for third-party connections.

Key Takeaways

Focus your resource hints on LCP-contributing elements like large images, web fonts, or hero banners, and wherever possible, leverage Early Hints for the best performance. These optimizations not only improve load time and user experience but also contribute to higher search engine rankings. Just remember, more isn’t always better. Target only the assets that impact the initial user experience to avoid unnecessary overhead.

Resource hints like preload, preconnect, and early hints are essential tools for improving web performance, particularly when optimizing for metrics like LCP (Largest Contentful Paint) and TTFB (Time to First Byte). In this article, we walk through real-world examples, demonstrating the measurable impact of each hint.

Baseline: No Resource Hint

HTML File: no-preload.html
JavaScript File: loader.js

This setup loads an HTML file, which loads a JavaScript file, which then loads an image. Each step incurs its own latency.

<!-- no-preload.html -->
<html>
  <head></head>
  <body>
    <script src="../javascript/loader.js"></script>
  </body>
</html>

// loader.js
const img = new Image();
img.src = "../images/background.png";
document.body.appendChild(img);

Impact: Each asset waits for the previous to load before it begins, compounding latency.

Client-Side Preload

HTML File: client-preload.html

By adding a <link rel="preload"> tag, we instruct the browser to fetch the image early—even before the JS requests it.

<link rel="preload" as="image" href="../images/background.png" />
<script src="../javascript/loader.js"></script>

Impact: The browser downloads the image in parallel with the JS file, saving one round-trip time.

Early Hints Preload

HTML File: eh-preload.html

This version moves the preload hint to the server using an HTTP 103 Early Hints response:

HTTP/1.1 103 Early Hints
Link: </images/background.png>; rel=preload; as=image

HTTP/1.1 200 OK
Content-Type: text/html

Impact: Resources start loading before the full response even arrives, outperforming client-side preload.

Client-Side Preconnect

HTML File: client-preconnect.html
JavaScript File: cdn-loader.js

In cases where only the domain of a resource is known, use preconnect:

<link rel="preconnect" href="https://cdn.example.com" />
<script src="https://cdn.example.com/cdn-loader.js"></script>
// cdn-loader.js
const img = new Image();
img.src = "https://img.example.com/background.png";
document.body.appendChild(img);

Impact: Reduces DNS, TCP, and TLS setup times for third-party resources, typically saving 100–300ms.

Early Hints Preconnect

HTML File: eh-preconnect.html

Move the preconnect instruction to the server to get the benefits even earlier:

HTTP/1.1 103 Early Hints
Link: <https://cdn.example.com>; rel=preconnect
Link: <https://img.example.com>; rel=preconnect

HTTP/1.1 200 OK

Impact: Provides the most aggressive latency reduction for third-party connections.

Key Takeaways

Focus your resource hints on LCP-contributing elements like large images, web fonts, or hero banners, and wherever possible, leverage Early Hints for the best performance. These optimizations not only improve load time and user experience but also contribute to higher search engine rankings. Just remember, more isn’t always better. Target only the assets that impact the initial user experience to avoid unnecessary overhead.

Discover how resource hints like preload, preconnect, and Early Hints can dramatically boost web performance. Learn how each hint impacts key metrics like LCP and TTFB, with practical examples and implementation strategies to speed up page load and enhance user experience.

Download

White arrow pointing right
Discover how resource hints like preload, preconnect, and Early Hints can dramatically boost web performance. Learn how each hint impacts key metrics like LCP and TTFB, with practical examples and implementation strategies to speed up page load and enhance user experience.

Download

White arrow pointing right
Discover how resource hints like preload, preconnect, and Early Hints can dramatically boost web performance. Learn how each hint impacts key metrics like LCP and TTFB, with practical examples and implementation strategies to speed up page load and enhance user experience.

Download

White arrow pointing right

Explore Recent Resources

Blog
GitHub Logo

5 Architectures for Web Personalization

Personalization is a data-delivery problem. Every architectural choice reduces to two distances: compute to user, and compute to fresh data. This piece maps five real architectures against both axes, scored on a concrete retailer workload where stale or slow data breaks the business.
Blog
Personalization is a data-delivery problem. Every architectural choice reduces to two distances: compute to user, and compute to fresh data. This piece maps five real architectures against both axes, scored on a concrete retailer workload where stale or slow data breaks the business.
Person with short dark hair and moustache, wearing a colorful plaid shirt, smiling outdoors in a forested mountain landscape.
Aleks Haugom
Senior Manager of GTM
Blog

5 Architectures for Web Personalization

Personalization is a data-delivery problem. Every architectural choice reduces to two distances: compute to user, and compute to fresh data. This piece maps five real architectures against both axes, scored on a concrete retailer workload where stale or slow data breaks the business.
Aleks Haugom
Jul 2026
Blog

5 Architectures for Web Personalization

Personalization is a data-delivery problem. Every architectural choice reduces to two distances: compute to user, and compute to fresh data. This piece maps five real architectures against both axes, scored on a concrete retailer workload where stale or slow data breaks the business.
Aleks Haugom
Blog

5 Architectures for Web Personalization

Personalization is a data-delivery problem. Every architectural choice reduces to two distances: compute to user, and compute to fresh data. This piece maps five real architectures against both axes, scored on a concrete retailer workload where stale or slow data breaks the business.
Aleks Haugom
Blog
GitHub Logo

Agentic Engineering Needs an Opinion: Why Scale Starts with Architecture

AI coding works in a sandbox because the environment is trivially narrow. Real systems have history, constraints, and blast radius. Coding agents make sound decisions only when the architecture is explicit and shared. Opinion isn't a constraint on agentic engineering, it's what makes it possible at scale.
Select*
Blog
AI coding works in a sandbox because the environment is trivially narrow. Real systems have history, constraints, and blast radius. Coding agents make sound decisions only when the architecture is explicit and shared. Opinion isn't a constraint on agentic engineering, it's what makes it possible at scale.
A smiling man with a beard and salt-and-pepper hair stands outdoors with arms crossed, wearing a white button-down shirt.
Stephen Goldberg
CEO & Co-Founder
Blog

Agentic Engineering Needs an Opinion: Why Scale Starts with Architecture

AI coding works in a sandbox because the environment is trivially narrow. Real systems have history, constraints, and blast radius. Coding agents make sound decisions only when the architecture is explicit and shared. Opinion isn't a constraint on agentic engineering, it's what makes it possible at scale.
Stephen Goldberg
Jun 2026
Blog

Agentic Engineering Needs an Opinion: Why Scale Starts with Architecture

AI coding works in a sandbox because the environment is trivially narrow. Real systems have history, constraints, and blast radius. Coding agents make sound decisions only when the architecture is explicit and shared. Opinion isn't a constraint on agentic engineering, it's what makes it possible at scale.
Stephen Goldberg
Blog

Agentic Engineering Needs an Opinion: Why Scale Starts with Architecture

AI coding works in a sandbox because the environment is trivially narrow. Real systems have history, constraints, and blast radius. Coding agents make sound decisions only when the architecture is explicit and shared. Opinion isn't a constraint on agentic engineering, it's what makes it possible at scale.
Stephen Goldberg
Blog
GitHub Logo

Building a Cozy Sandbox Game on Harper

A nature-restoration game with six biomes, 150 animals, and a real food web — built with a single Harper component as the entire backend. One YAML file wires the database, API, content seeder, and static host. The same binary ships offline on itch.io.
Shell
Blog
A nature-restoration game with six biomes, 150 animals, and a real food web — built with a single Harper component as the entire backend. One YAML file wires the database, API, content seeder, and static host. The same binary ships offline on itch.io.
Person with long wavy brown hair wearing a bright pink shirt with a teal trim, smiling outdoors in soft sunlight with blurred trees in the background.
Bailey Dunning
Forward Deployed Engineer
Blog

Building a Cozy Sandbox Game on Harper

A nature-restoration game with six biomes, 150 animals, and a real food web — built with a single Harper component as the entire backend. One YAML file wires the database, API, content seeder, and static host. The same binary ships offline on itch.io.
Bailey Dunning
Jun 2026
Blog

Building a Cozy Sandbox Game on Harper

A nature-restoration game with six biomes, 150 animals, and a real food web — built with a single Harper component as the entire backend. One YAML file wires the database, API, content seeder, and static host. The same binary ships offline on itch.io.
Bailey Dunning
Blog

Building a Cozy Sandbox Game on Harper

A nature-restoration game with six biomes, 150 animals, and a real food web — built with a single Harper component as the entire backend. One YAML file wires the database, API, content seeder, and static host. The same binary ships offline on itch.io.
Bailey Dunning
Blog
GitHub Logo

Your Website was Built for Humans. AI Needs Something Cleaner.

The web spent a decade optimizing for browsers. JavaScript-heavy rendering, dynamic CMS templates, and client-side hydration made pages beautiful and machines blind. AI answer engines retrieve, parse, and cite content directly. If your best content is trapped behind a render cycle, a cleaner source wins.
A.I.
Blog
The web spent a decade optimizing for browsers. JavaScript-heavy rendering, dynamic CMS templates, and client-side hydration made pages beautiful and machines blind. AI answer engines retrieve, parse, and cite content directly. If your best content is trapped behind a render cycle, a cleaner source wins.
Person with short dark hair and moustache, wearing a colorful plaid shirt, smiling outdoors in a forested mountain landscape.
Aleks Haugom
Senior Manager of GTM
Blog

Your Website was Built for Humans. AI Needs Something Cleaner.

The web spent a decade optimizing for browsers. JavaScript-heavy rendering, dynamic CMS templates, and client-side hydration made pages beautiful and machines blind. AI answer engines retrieve, parse, and cite content directly. If your best content is trapped behind a render cycle, a cleaner source wins.
Aleks Haugom
Jun 2026
Blog

Your Website was Built for Humans. AI Needs Something Cleaner.

The web spent a decade optimizing for browsers. JavaScript-heavy rendering, dynamic CMS templates, and client-side hydration made pages beautiful and machines blind. AI answer engines retrieve, parse, and cite content directly. If your best content is trapped behind a render cycle, a cleaner source wins.
Aleks Haugom
Blog

Your Website was Built for Humans. AI Needs Something Cleaner.

The web spent a decade optimizing for browsers. JavaScript-heavy rendering, dynamic CMS templates, and client-side hydration made pages beautiful and machines blind. AI answer engines retrieve, parse, and cite content directly. If your best content is trapped behind a render cycle, a cleaner source wins.
Aleks Haugom