Server Components, without the client JavaScript
Most React libraries for Notion are ordinary components. They render on the server for the first paint, then the same code is downloaded and runs again in the browser to attach event handlers, a step called hydration. For an interactive app that is the point. For a blog post, it means sending the reader a renderer, a syntax highlighter and a math library, so that they can draw text that was already on the screen.
Rendering once
React Server Components run only on the server. Their output is sent to the browser as finished HTML, and their code never is. notion-rsc is built this way: the renderer, Shiki and KaTeX stay on the server, however many code blocks and equations a post has.
| Client components | Server Components | |
|---|---|---|
| Renderer in the bundle | Yes | No |
| Highlighter in the bundle | When used | No |
| Hydration | Whole page | None |
Where JavaScript is still useful
A few things genuinely need the browser. The play buttons on embedded players are small client components: they swap a card for the real player when clicked. Posts on X use react-tweet, which adds a little interactivity of its own. Everything else is HTML.
The trade-off
Server Components need a framework that supports them: Next.js with the App Router, Waku, React Router, and a growing list. If your site already runs on one of these, there is nothing to set up. If it does not, a client-side renderer is the better fit.