Architecture
This project is built on HonoX + @hono/vite-ssg (SSG, static site generation). Pages emit static HTML by default; only components that genuinely need client-side interactivity are "promoted" to islands (client JS snippets).
Every component's hydration behaviour funnels through the
shouldHydratepredicate inapp/components/ui/island-utils.ts. Any decision about when to render static HTML versus when to mount a client-side island is resolved here — see Hydration for the full tier model, decision rules, and per-component classification.
- Zero redundant JS — components with no interaction need never ship a hydration script.
- Zero silent breakage — components that do need interaction should hydrate automatically, even if the caller forgets to pass
interactive. - Single source of truth — every "should this hydrate?" decision goes through one shared
shouldHydratefunction, eliminating per-component ad-hocif (interactive)branches.