withastro/astro · error · Error

Renderer ${renderer.name} does not provide a serverEntrypoin

Error message

Renderer ${renderer.name} does not provide a serverEntrypoint.

What it means

After confirming `renderer.name` is set, `addRenderer` requires `renderer.serverEntrypoint` to be truthy. Without it Astro cannot render the framework on the server, so it throws a plain Error naming the offending renderer.

Source

Thrown at packages/astro/src/integrations/hooks.ts:235

		const { integrationLogger } = await runHookInternal({
			integration,
			hookName: 'astro:config:setup',
			logger,
			params: () => {
				const hooks: Omit<HookParameters<'astro:config:setup'>, 'logger'> = {
					config: updatedConfig,
					command,
					isRestart,
					addRenderer(renderer: AstroRenderer) {
						if (!renderer.name) {
							throw new Error(
								`Integration ${colors.bold(integration.name)} has an unnamed renderer.`,
							);
						}

						if (!renderer.serverEntrypoint) {
							throw new Error(
								`Renderer ${colors.bold(renderer.name)} does not provide a serverEntrypoint.`,
							);
						}

						if (renderer.name === 'astro:jsx') {
							astroJSXRenderer = renderer;
						} else {
							updatedSettings.renderers.push(renderer);
						}
					},
					injectScript: (stage, content) => {
						updatedSettings.scripts.push({ stage, content });
					},
					updateConfig: (newConfig) => {
						// Logger destination is updated later because it's async
						if (newConfig.logger?.entrypoint) {
							isLoggerUpdated = true;
						}

View on GitHub (pinned to d081033d5f)

Solutions

  1. Set `serverEntrypoint` to the module specifier of your framework's server renderer (e.g. `'@astrojs/react/server.js'`).
  2. Confirm the entrypoint module exists and exports the expected server render function.
  3. Validate the full `AstroRenderer` object before calling `addRenderer`.

Example fix

// before
addRenderer({ name: '@my/framework' })

// after
addRenderer({
  name: '@my/framework',
  serverEntrypoint: '@my/framework/server.js',
})
Defensive patterns

Strategy: validation

Validate before calling

function assertRendererHasEntrypoint(renderer) {
  if (!renderer || !renderer.serverEntrypoint) {
    throw new Error(`Renderer ${renderer?.name} needs serverEntrypoint`);
  }
}

Type guard

function rendererHasEntrypoint(renderer) {
  return !!renderer && !!renderer.serverEntrypoint;
}

Try / catch

null

Prevention

When it happens

Trigger: An integration calls `addRenderer({ name: 'foo' })` (or with `serverEntrypoint: undefined`/empty), omitting the server entrypoint module specifier.

Common situations: Authoring a renderer and forgetting the `serverEntrypoint` field; pointing it at a path that resolved to undefined due to a typo or conditional that returned nothing; using a renderer version whose entrypoint export moved.

Related errors


AI-assisted analysis of withastro/astro@d081033d5f (2026-08-12). Data as JSON: /api/errors/955db5ab9b46f136. Report an issue: GitHub.