{"record":{"id":"955db5ab9b46f136","repo":"withastro/astro","slug":"renderer-renderer-name-does-not-provide-a-serve","errorCode":null,"errorMessage":"Renderer ${renderer.name} does not provide a serverEntrypoint.","messagePattern":"Renderer (.+?) does not provide a serverEntrypoint\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/astro/src/integrations/hooks.ts","lineNumber":235,"sourceCode":"\n\t\tconst { integrationLogger } = await runHookInternal({\n\t\t\tintegration,\n\t\t\thookName: 'astro:config:setup',\n\t\t\tlogger,\n\t\t\tparams: () => {\n\t\t\t\tconst hooks: Omit<HookParameters<'astro:config:setup'>, 'logger'> = {\n\t\t\t\t\tconfig: updatedConfig,\n\t\t\t\t\tcommand,\n\t\t\t\t\tisRestart,\n\t\t\t\t\taddRenderer(renderer: AstroRenderer) {\n\t\t\t\t\t\tif (!renderer.name) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Integration ${colors.bold(integration.name)} has an unnamed renderer.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!renderer.serverEntrypoint) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Renderer ${colors.bold(renderer.name)} does not provide a serverEntrypoint.`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (renderer.name === 'astro:jsx') {\n\t\t\t\t\t\t\tastroJSXRenderer = renderer;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tupdatedSettings.renderers.push(renderer);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tinjectScript: (stage, content) => {\n\t\t\t\t\t\tupdatedSettings.scripts.push({ stage, content });\n\t\t\t\t\t},\n\t\t\t\t\tupdateConfig: (newConfig) => {\n\t\t\t\t\t\t// Logger destination is updated later because it's async\n\t\t\t\t\t\tif (newConfig.logger?.entrypoint) {\n\t\t\t\t\t\t\tisLoggerUpdated = true;\n\t\t\t\t\t\t}","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/withastro/astro/blob/d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca/packages/astro/src/integrations/hooks.ts#L217-L253","documentation":"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.","triggerScenarios":"An integration calls `addRenderer({ name: 'foo' })` (or with `serverEntrypoint: undefined`/empty), omitting the server entrypoint module specifier.","commonSituations":"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.","solutions":["Set `serverEntrypoint` to the module specifier of your framework's server renderer (e.g. `'@astrojs/react/server.js'`).","Confirm the entrypoint module exists and exports the expected server render function.","Validate the full `AstroRenderer` object before calling `addRenderer`."],"exampleFix":"// before\naddRenderer({ name: '@my/framework' })\n\n// after\naddRenderer({\n  name: '@my/framework',\n  serverEntrypoint: '@my/framework/server.js',\n})","handlingStrategy":"validation","validationCode":"function assertRendererHasEntrypoint(renderer) {\n  if (!renderer || !renderer.serverEntrypoint) {\n    throw new Error(`Renderer ${renderer?.name} needs serverEntrypoint`);\n  }\n}","typeGuard":"function rendererHasEntrypoint(renderer) {\n  return !!renderer && !!renderer.serverEntrypoint;\n}","tryCatchPattern":"null","preventionTips":["Always set serverEntrypoint on renderer objects.","Confirm the entrypoint module resolves and exports the server render function.","Validate the full AstroRenderer shape before addRenderer."],"tags":["integrations","renderers","config","ssr"],"backgroundTag":null,"analyzedSha":"d081033d5fe8e8a68c4bbbad4af9d2deb9c74bca","analyzedAt":"2026-08-12T13:37:29.035Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}