withastro/astro · error · Error

Renderer ${colors.bold(renderer.name)} does not provide a se

Error message

Renderer ${colors.bold(renderer.name)} does not provide a serverEntrypoint.

What it means

When an integration registers a renderer via `addRenderer`, Astro requires a `serverEntrypoint` - the module that renders the framework to markup on the server (or at build time). The addRenderer callback throws this plain Error when serverEntrypoint is missing, after the name check has passed.

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 52e6c34790)

Solutions

  1. Provide serverEntrypoint pointing at the server rendering module: addRenderer({ name: '@myorg/solid', serverEntrypoint: '@myorg/solid/server.js' }).
  2. Verify the package/specifier actually exists; a typo resolves to undefined only if you build the object dynamically.
  3. Type the renderer object as AstroRenderer so missing required fields fail at compile time.

Example fix

// before
addRenderer({ name: '@myorg/solid', clientEntrypoint: '@myorg/solid/client.js' });

// after
addRenderer({
  name: '@myorg/solid',
  serverEntrypoint: '@myorg/solid/server.js',
  clientEntrypoint: '@myorg/solid/client.js',
});
Defensive patterns

Strategy: validation

Validate before calling

// before calling addRenderer in your integration
if (!renderer.serverEntrypoint) {
  throw new Error('renderer.serverEntrypoint is required');
}
addRenderer(renderer);

Type guard

import type { AstroRenderer } from 'astro';
function isCompleteRenderer(r: Partial<AstroRenderer>): r is AstroRenderer {
  return typeof r.name === 'string' && !!r.serverEntrypoint;
}

Prevention

When it happens

Trigger: An integration calling addRenderer({ name: '@myorg/solid' }) with no serverEntrypoint; entry point variables that resolve to undefined due to a bad import or string; renderers assembled from partial objects where the entry point key was misspelled (e.g. serverEntry).

Common situations: Authoring a renderer integration and forgetting the required field; renames or refactors leaving the key undefined; integrations adapted from examples that omitted it.

Related errors


AI-assisted analysis of withastro/astro@52e6c34790 (2026-08-18). Data as JSON: /api/errors/4cd75e093c0a400e. Report an issue: GitHub.