{"record":{"id":"9b84e98df9d16961","repo":"withastro/astro","slug":"packagename-doesn-t-appear-to-be-an-integration","errorCode":null,"errorMessage":"${packageName} doesn't appear to be an integration or an adapter. Find our official integrations at https://astro.build/integrations","messagePattern":"(.+?) doesn't appear to be an integration or an adapter\\. Find our official integrations at https://astro\\.build/integrations","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/astro/src/cli/add/index.ts","lineNumber":923,"sourceCode":"\t\t\t\tif (pkgJson['peerDependencies']) {\n\t\t\t\t\tconst meta = pkgJson['peerDependenciesMeta'] || {};\n\t\t\t\t\tfor (const peer in pkgJson['peerDependencies']) {\n\t\t\t\t\t\tconst optional = meta[peer]?.optional || false;\n\t\t\t\t\t\tconst isAstro = peer === 'astro';\n\t\t\t\t\t\tif (!optional && !isAstro) {\n\t\t\t\t\t\t\tdependencies.push([peer, pkgJson['peerDependencies'][peer]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet integrationType: IntegrationInfo['type'];\n\t\t\t\tconst keywords = Array.isArray(pkgJson['keywords']) ? pkgJson['keywords'] : [];\n\t\t\t\tif (keywords.includes('astro-integration')) {\n\t\t\t\t\tintegrationType = 'integration';\n\t\t\t\t} else if (keywords.includes('astro-adapter')) {\n\t\t\t\t\tintegrationType = 'adapter';\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${bold(\n\t\t\t\t\t\t\tpackageName,\n\t\t\t\t\t\t)} doesn't appear to be an integration or an adapter. Find our official integrations at ${cyan(\n\t\t\t\t\t\t\t'https://astro.build/integrations',\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (integration === 'tailwind') {\n\t\t\t\t\tintegrationName = 'tailwind';\n\t\t\t\t\tdependencies = [\n\t\t\t\t\t\t['@tailwindcss/vite', '^4.0.0'],\n\t\t\t\t\t\t['tailwindcss', '^4.0.0'],\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid: integration,\n\t\t\t\t\tpackageName,","sourceCodeStart":905,"sourceCodeEnd":941,"githubUrl":"https://github.com/withastro/astro/blob/e294953aa8aadd98d5be92e60a03037b05dbdfd4/packages/astro/src/cli/add/index.ts#L905-L941","documentation":"`astro add` successfully fetched the package.json but its `keywords` array contains neither `astro-integration` nor `astro-adapter`. Keywords are the machine-readable marker Astro uses to distinguish real integrations/adapters from arbitrary npm packages, so it refuses to install and wire up anything unmarked.","triggerScenarios":"`astro add <non-integration-package>` (any npm package without the keywords); adding a community integration whose author forgot `\"astro-integration\"` or `\"astro-adapter\"` in package.json; adding a package that is a plain library even though it is Astro-related.","commonSituations":"Expecting `astro add` to work for any npm package; third-party integration authors omitting keywords; testing your own unpublished integration locally without the keywords set.","solutions":["If the package is not an integration/adapter, install it with your package manager directly (`npm i <pkg>`) instead of `astro add`","If it IS a real integration missing keywords, install it manually and register it in astro.config yourself, or ask the author/PR to add `\"astro-integration\"` (or `\"astro-adapter\"`) to package.json keywords","If you are the author, publish with the correct keywords so `astro add` accepts the package"],"exampleFix":"// before — package.json of the community integration\n\"keywords\": [\"astro\", \"markdown\"]\n\n// after\n\"keywords\": [\"astro\", \"astro-integration\", \"markdown\"]","handlingStrategy":"validation","validationCode":"import { execSync } from 'node:child_process';\n\nfunction isAstroIntegration(spec) {\n  try {\n    const keywords = JSON.parse(\n      execSync(`npm view ${spec} keywords --json`, { stdio: ['pipe', 'pipe', 'ignore'] }).toString(),\n    );\n    return (\n      Array.isArray(keywords) &&\n      (keywords.includes('astro-integration') || keywords.includes('astro-adapter'))\n    );\n  } catch {\n    return false;\n  }\n}\n\nif (!isAstroIntegration(spec)) {\n  // install as a normal dependency instead of `astro add`\n}","typeGuard":"function isAddableIntegration(pkgJson) {\n  const keywords = Array.isArray(pkgJson?.keywords) ? pkgJson.keywords : [];\n  return keywords.includes('astro-integration') || keywords.includes('astro-adapter');\n}","tryCatchPattern":null,"preventionTips":["Reserve `astro add` for packages documented as Astro integrations or adapters","If you author integrations, include 'astro-integration' (or 'astro-adapter') in package.json keywords from the first release","Check `npm view <pkg> keywords` once when adding a community integration to a template"],"tags":["cli","astro-add","package-metadata","integrations","adapters"],"backgroundTag":"incompatible-package-type","analyzedSha":"e294953aa8aadd98d5be92e60a03037b05dbdfd4","analyzedAt":"2026-08-18T18:48:03.901Z","contentChangedAt":"2026-08-18T18:48:03.901Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}