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
- Provide serverEntrypoint pointing at the server rendering module: addRenderer({ name: '@myorg/solid', serverEntrypoint: '@myorg/solid/server.js' }).
- Verify the package/specifier actually exists; a typo resolves to undefined only if you build the object dynamically.
- 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
- Type renderer objects as AstroRenderer; serverEntrypoint is required.
- Verify entry point specifiers resolve (import or resolve.sync) in integration tests.
- Watch for misspelled keys like serverEntry when porting renderers from other systems.
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
- Integration ${colors.bold(integration.name)} has an unnamed
- Integration ${colors.bold(integrationName)} is injecting a t
- The "${integration.name}" integration is trying to add the "
- The "${integration.name}" integration is trying to add middl
- Integration "${maybeConflictingIntegration}" conflicts with
AI-assisted analysis of withastro/astro@52e6c34790 (2026-08-18).
Data as JSON: /api/errors/4cd75e093c0a400e.
Report an issue: GitHub.