Incremental Static Regeneration: Dynamic Websites with SSR and Cache Headers

📆 · ⏳ 4 min read · ·


Hey there! Today, we’ll get into understanding a very beautiful and powerful concept called Incremental Static Regeneration, lovingly also known as ISR.

Don’t worry if that sounds like a spell from a wizard’s book – by the end of this post, you’ll not only understand what is ISR but also wield the power of SSR and caching headers like a pro. Ready to brew some magic? Let’s go!

A Peek at Incremental Static Regeneration (ISR)

Picture this: a website that’s both fast and dynamic. That’s the power of Incremental Static Regeneration.

ISR takes the idea of Static Site Generation (SSG) to the next level by generating static pages on-the-fly, dynamically updating content without sacrificing speed.


Did you know that Reddit used ISR for optimising the r/place using Fastly CDN and caching the requests for 1 second! Read more about it on their engineering blog ↗️

The SSR Enchantment

Server-Side Rendering (SSR) is like having a real-time spellchecker for your website. Unlike traditional client-side rendering, where browsers do all the heavy lifting, SSR does the rendering on the server before sending it to the client.

This means your visitors see a fully loaded page right from the start, and search engines can index your content easily.

Harnessing Cache Headers

Now, let’s sprinkle some magic with cache headers. Cache headers tell browsers (or shared caches like CDNs) how long they can cache content. We achieve this by using the cache headers like max-age or s-maxage. But there’s a twist – with ISR, we don’t want to serve outdated content.

Enter cache control header stale-while-revalidate – this option allow browsers (or CDNs) to serve cached content while simultaneously fetching updated data in the background.

This means faster load times and constantly fresh content.

Implementation in Action

Ready to weave this wizardry into your website? Here’s a quick guide:

Configure SSR

Set up SSR for your website. There are many frameworks like Next.js, Astro etc. make this remarkably smooth.

These are some of their links on how to setup SSR in Next ↗️, or Astro ↗️ or any other framework that might support it.

Craft Cache Headers

Implement cache headers that suit your content. For example if you want to cache the content for 15 minutes you can use max-age=900 to cache on browser or s-maxage=900 for shared caches.

Use "stale-while-revalidate" to combine speed and freshness. I found this video to be very helpful in understanding these different cache headers.

Video by Ryan Florence on YouTube ↗️

Dive into ISR

Identify the parts of your website that can benefit from ISR. This can be blog posts which changes frequently, news sections, or product listings etc.

Basically the idea is that you want to pick a page or types of pages which more or less have some content that changes dynamically but with some time.

Another good candidate could be for some pages where you are fetching records from database or some third party service which bills you based on the number of API calls, and you want to avoid making too many API calls.

So take some time and go through your app and determine what all pages can benefit from ISR.

Once you have identified it, you can start implementing the requires changes, again this will depend on the framework you are using but at the basic level you have to enable SSR on that page and use cache headers to cache the page for some time.

Deploy and Observe

Deploy your enchanted site and witness the magic unfold. Monitor how pages load faster and content stays up-to-date.

If you have some sort of logging in place, then that would be a good place to start monitoring for how many times the page is being revalidated or the difference between the number of times the page is being served from cache vs the number of times it is being revalidated.

Optimize and Iterate

Like any spell, practice makes perfect. Experiment with cache durations and fine-tune your ISR strategy for optimal results.

You might find yourself in situation where you either cached too aggressively or not enough, so you can always go back and change the cache headers to suit your needs.

One thing to keep in mind is that in case you are in doubt of how long do you want to cache, always pick a lower duration.

You do not want to cache aggressively first and then realise that you have to invalidate the cache and then wait for the cache to expire.


Check out this example repository to see ISR in action with Astro + Cloudflare Workers ↗️ and the live demo ↗️


Congratulations! You’ve uncovered the art of Incremental Static Regeneration, armed yourself with SSR’s speed, and adorned your website with cache headers’ freshness.

Your site is now a dynamic masterpiece that loads in a flash and keeps visitors spellbound with the latest content. So go forth, wield this newfound magic, and enchant the digital world with your web creations!

You may also like

  • How I use GPG in my day to day workflows

    GPG is a powerful tool that allows you to encrypt and sign your data and communications. In this post, I will explain how I use GPG in my day to day workflows.

  • What is GPG and why you should start using it

    GPG is a tool that allows you to encrypt and sign your data and communications. In this post, I will explain what GPG is and why you should start using it in your workflows if you aren't already.

  • Selecting the Right Git Merging Strategy: Merge Commit, Squash and Merge, or Rebase and Merge

    Uncover the intricacies of Git merging strategies – merge commit, squash and merge, and rebase and merge. Discover the pros and cons of each approach and learn how to navigate the decision-making process based on your project's dynamics and team preferences.