Islands, not a single-page app
August 29, 2026
A Trestle page is plain HTML by default. Nav, Footer, Hero, Card, Button — none of them ship a byte
of JavaScript on their own. When a page needs real interactivity — a filter, a live counter, a form
with client-side validation — you drop in a React component and hydrate it with a client:*
directive. Only that component’s JavaScript reaches the browser; everything else on the page stays
static.
The blog page is the real example: the tag filter is a React island
(client:load), but the post list itself, the layout, and everything else on the page is
server-rendered HTML with no client-side framework attached. Open devtools, click a tag, and
nothing outside that one component re-renders — because nothing outside it is JavaScript to begin
with.
This is also why @astrojs/react is the only UI framework integration installed: islands work
per-component, so there’s no reason to standardize on a framework for the whole site just to get
interactivity in one corner of it.