SSR & streaming
Skeletons in the first byte of server HTML — before hydration, before JavaScript.
A skeleton whose layout is known without touching the DOM is rendered on the server as real elements, so it arrives in the initial HTML and paints before any JavaScript runs. That is what makes <Skelly> usable as a Next.js loading.tsx or a Suspense fallback, where there is no client runtime yet to mount into.
Which skeletons can be server rendered
Three cases need no measurement, and all three ship in the server response: an explicit spec, a preset, and a container with no children — a standalone route fallback, which resolves to the generic skeleton.
A measured skeleton cannot be. Measuring means reading real geometry off real markup, and inside a loading.tsx the page it would measure has not rendered — the fallback renders instead of it. Those skeletons mount after hydration, which is the right trade for a client-side loading state and the wrong one for a route fallback.
Reserved space, no layout jump
Skeleton items are absolutely positioned, so a standalone skeleton would otherwise give its container no height and paint over whatever follows it. When there is no real content underneath, the overlay joins normal flow and carries the spec’s own extent, reserving exactly the space the skeleton occupies.