Post

ogygia β€” SSR islands for SvelteKit. Plus lakes. No Kit patches. csr=false. Mark the interactive bits; the rest stays server HTML. Runtime β‰ˆ 7.6 KB min+brotli (CE + optional SPA router). 🏝️ Client islands Β· πŸ›°οΈ Server islands Β· 🌊 Lakes Β· πŸ”Œ Remotes & forms Β· 🧭 SPA router ogygia.puruvj.dev

🏝️ Client islands Static hydrate / preset. JS when you say so: β€’ load β€” on connect β€’ idle β€” requestIdleCallback β€’ visible β€” IntersectionObserver β€’ media β€” e.g. mobile-only drawers Props via devalue. Nesting works.

πŸ›°οΈ Server islands defer = fallback HTML, then a signed fetch for real markup. Component JS never ships. Same schedules: load (w/ preload), idle, visible, media. Cookie-aware β€” the hole sees a real request.

🌊 Lakes hydrate: 'none' freezes a subtree inside an island. Markup stays; that subtree’s JS never ships. Remount: cache, empty, or SWR. An island inside a lake wakes up again.

πŸ”Œ Data stays Kit β€’ +page.server props β†’ islands (devalue) β€’ classic form actions β€” zero JS β€’ remotes: query, command, query.live, query.batch, form() Real Kit wire codec β€” not a reimplementation.

0 reposts3 likes

🧭 <OgygiaRouter /> SPA body swap + head merge. View Transitions on. $app/navigation still works. β€’ data-ogygia-persist β€” chrome survives swaps β€’ Kit-style link prefetch β€’ Adopt one route at a time next to Kit pages

Also: β€’ Lazy chunk after click β†’ host island + plain await import() β€’ Dynamic import + hydrate = build error (SSR needs a static shell) β€’ csr=false HMR; FOUC bag so SPA swaps don’t blank CSS