WTF is Island Architecture in Frontend? Explained Simply


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
Strategy | Page Delivered As | JS Hydration | Perf Hit |
CSR (Client-Side Rendering) | Empty div + JS | Whole page | 💀 |
SSR (Server-Side Rendering) | Full HTML | Whole page | 😐 |
SSG (Static Site Generation) | Full HTML | Whole page | 😐 |
Islands | Full HTML | Partial (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!
- 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>
);
}
- 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:
Component | Is Interactive? | JS Sent |
Header | ❌ | ❌ |
Hero | ❌ | ❌ |
About | ❌ | ❌ |
Counter | ✅ | ✅ |
Footer | ❌ | ❌ |
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.