WTF is Island Architecture in Frontend? Explained Simply

Neelesh RoyNeelesh Roy
3 min read

If you’ve been around the frontend scene lately, you’ve probably heard someone mumble “island architecture” while debating SSR, hydration, or some obscure edge function. But WTF is it actually? And why should you care?

The TL;DR

Island architecture is a modern frontend rendering strategy where your page is mostly static HTML, but specific interactive components ("islands") are hydrated with JavaScript on the client side. Think of them as "interactive hotspots" embedded inside an otherwise calm ocean of static markup.

It’s an evolution beyond traditional SSR or CSR. It’s smarter, faster, and more resource-aware.

A real-life example

Imagine a vacation resort (your website):

  • Most of the resort (your page) is just beautiful static scenery – trees, sand, chairs.

  • The only places that need “action” are the swimming pool, the gym, and the bar – those are your islands.

  • You don’t need to power up the whole resort just to turn on the blender at the bar.

In the same way, Island Architecture lets you send just the HTML for the whole page, and hydrate only those interactive bits.

Differences with others

StrategyPage Delivered AsJS HydrationPerf Hit
CSR (Client-Side Rendering)Empty div + JSWhole page💀
SSR (Server-Side Rendering)Full HTMLWhole page😐
SSG (Static Site Generation)Full HTMLWhole page😐
IslandsFull HTMLPartial (only islands)🚀

How it works?

  • Server renders the full HTML

  • Each island is wrapped as a component with a hydration directive

  • The HTML for the island is shipped with some "island marker"

  • A small JavaScript loader picks up those markers and hydrates only those chunks

  • Everything else remains untouched, like a good static site should

Action Please!

  1. Perform all the installation steps and create a counter
npm create astro@latest
cd my-project
npm install
npm run dev
npm install @astrojs/react
npx astro add react

// src/components/Counter.jsx
import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      Count: {count}
    </button>
  );
}
  1. Add index.astro file which uses the Counter
---
import Counter from '../components/Counter.jsx';
---

<html>
  <head>
    <title>Astro Island Example</title>
  </head>
  <body>
    <h1>Welcome to my mostly static page</h1>

    <!-- This component will be hydrated only on client load -->
    <Counter client:load />
  </body>
</html>

☝️ The client:load directive tells Astro:

“Hey, hydrate this component on the client — but leave the rest of the page alone.”

Under the hood comparison

Say your page looks like this:

export default function HomePage() {
  return (
    <>
      <Header />
      <Hero />
      <About />
      <Testimonials />
      <Counter />
      <Footer />
    </>
  );
}

In SSR frameworks the following things happen:

  • Attach event listeners

  • Rebuild the the entire virtual DOM

  • Sync (hydrate) that with the existing HTML

You might only want Counter to be interactive. But when React hydrates the page, it doesn’t know or care about that — it hydrates the entire tree from Header to Footer. It will pull all the JS bundles for Headers, Footers, Hero, Counter etc.

How Islands fix this?

---
import Counter from '../components/Counter.jsx';
---

<Header />
<Hero />
<About />
<Counter client:load />
<Footer />

What gets shipped to the Browser:

ComponentIs Interactive?JS Sent
Header
Hero
About
Counter
Footer
7
Subscribe to my newsletter

Read articles from Neelesh Roy directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Neelesh Roy
Neelesh Roy

Neelesh is a Senior Frontend Engineer in the insurance technology industry. He specializes in building responsive, reliable, and user-friendly web applications. With years of experience in modern JavaScript frameworks, he cares deeply about clean code, performance, and good user experience. Neelesh enjoys solving complex business problems with simple, practical solutions. He often works closely with designers and backend teams to bring ideas to life. Outside of work, he likes to stay updated with the latest in web development and technology trends.