Renderers
A renderer is the step between what a generator returns and the FileNodes the engine writes. A generator has two ways to produce output. It can build FileNodes directly with the ast.factory node builders, or it can return elements and let a renderer walk them into FileNodes. The renderer is the second path.
Why rendering is a separate step
Building files by hand with ast.factory is precise, but it gets verbose once a file has imports, several declarations, and JSDoc. JSX reads better for that. It lets a generator describe output as components and nesting instead of a flat list of create* calls. Keeping the renderer separate means the generator does not care which style produced the file. The engine gets FileNodes either way.
Kubb ships kubb/jsx for the JSX path. Its jsxRenderer is React-free: it walks the components as plain functions with no reconciliation pass, so hooks and suspense are not part of the model. A generator turns it on by setting its renderer field.
When you write your own
Most plugins never need a custom renderer. Reach for createRenderer only when a generator emits through some other templating format and needs it walked into FileNodes. If you are building files directly or through JSX, the shipped tools already cover you.
Reference
createRenderer and jsxRenderer live in the Kit API reference. The full JSX component set, the runtime subpaths, and the built-in components are in the JSX API reference. See AST for the ast.factory builders that are the alternative to rendering.