The fastest page load is the one that happened before the click. That was always the promise of prefetching—but the old <link rel="prefetch"> only warmed the cache. The Speculation Rules API goes further: it can fully prerender the next page—fetched, parsed, scripted, painted—in a hidden renderer, then swap it in instantly on navigation.

Declaring the bet

<script type="speculationrules">
{
  "prerender": [{
    "where": { "href_matches": "/blog/*" },
    "eagerness": "moderate"
  }]
}
</script>

eagerness is the risk dial. conservative speculates on pointer-down—nearly free, saves ~100ms. moderate triggers on hover, the sweet spot for content sites: by the time a reader hovers a card for 200ms, the odds they click are high and the page is ready when they do. eager speculates as links enter the viewport—spectacular, and only defensible for tiny static pages.

“Perceived performance is just real performance that started early.”

Betting responsibly

Prerendered pages run for real—so gate analytics and anything stateful behind the prerenderingchange event, or you will count phantom views. Exclude logout links, cart mutations, and anything with side effects from your URL patterns. Respect data-saver users (browsers largely do this for you), and let the browser’s own limits cap concurrent speculations.

Done well, a blog’s internal navigation simply stops having load time. Readers notice—they just cannot say what changed.