{"record":{"id":"01cd7dd0414d8536","repo":"withastro/astro","slug":"astro-markdown-remarkplugins-rehypeplugins","errorCode":null,"errorMessage":"[astro] `markdown.remarkPlugins`/`rehypePlugins`/`remarkRehype` are set, but your `${current.name}` processor doesn't run them. Move them to `unified({...})` from `@astrojs/markdown-remark` and set `markdown.processor: unified({...})` if you want them to apply.","messagePattern":"\\[astro\\] `markdown\\.remarkPlugins`/`rehypePlugins`/`remarkRehype` are set, but your `(.+?)` processor doesn't run them\\. Move them to `unified\\((.+?)\\)` from `@astrojs/markdown-remark` and set `markdown\\.processor: unified\\((.+?)\\)` if you want them to apply\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/astro/src/core/config/validate.ts","lineNumber":115,"sourceCode":"\t\t\ttarget.options.rehypePlugins.push(...rehypePlugins.slice(counts.rehype));\n\t\t}\n\t\t// `remarkRehype` is an object, so Object.assign is idempotent for unchanged keys\n\t\t// and absorbs any new keys integrations add.\n\t\tObject.assign(target.options.remarkRehype, remarkRehype);\n\t\tmigratedLegacyPluginCounts.set(target.options, {\n\t\t\tremark: remarkPlugins.length,\n\t\t\trehype: rehypePlugins.length,\n\t\t});\n\t\tif (!didWarnAboutLegacyMarkdownPlugins) {\n\t\t\tdidWarnAboutLegacyMarkdownPlugins = true;\n\t\t\tconsole.warn(\n\t\t\t\t'[astro] `markdown.remarkPlugins`, `markdown.rehypePlugins`, and `markdown.remarkRehype` are deprecated. Pass them to `unified({...})` from `@astrojs/markdown-remark` directly instead.',\n\t\t\t);\n\t\t}\n\t} else if (!didWarnAboutProcessorMismatch) {\n\t\t// Third-party processors can't run remark/rehype plugins. And if they can, they should be passed directly to the processor (like it is for unified) instead of the legacy keys, so we warn either way.\n\t\tdidWarnAboutProcessorMismatch = true;\n\t\tconsole.warn(\n\t\t\t`[astro] \\`markdown.remarkPlugins\\`/\\`rehypePlugins\\`/\\`remarkRehype\\` are set, but your ` +\n\t\t\t\t`\\`${current.name}\\` processor doesn't run them. Move them to \\`unified({...})\\` from ` +\n\t\t\t\t'`@astrojs/markdown-remark` and set `markdown.processor: unified({...})` if you want ' +\n\t\t\t\t'them to apply.',\n\t\t);\n\t}\n}\n\n/**\n * Used twice:\n * - To validate the user config\n * - To validate the config after all integrations (that may have updated it)\n */\nexport async function validateConfigRefined(updatedConfig: AstroConfig): Promise<AstroConfig> {\n\tawait coerceLegacyMarkdownPlugins(updatedConfig);\n\twarnDeprecatedMarkdownOptions(updatedConfig);\n\treturn await AstroConfigRefinedSchema.parseAsync(updatedConfig, { error: errorMap });\n}","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/withastro/astro/blob/52e6c34790cc8ac4e69e6135ace06049867e5c4a/packages/astro/src/core/config/validate.ts#L97-L133","documentation":"Same legacy markdown keys, but markdown.processor is set to a non-unified (third-party) processor. Such processors do not run Astro's remark/rehype plugin pipeline, so markdown.remarkPlugins/rehypePlugins/remarkRehype are silently inert; Astro warns once that the options do nothing and how to make them apply.","triggerScenarios":"markdown.processor set to a custom/third-party processor (e.g. satteri) AND markdown.remarkPlugins / rehypePlugins / remarkRehype set — the fold only applies to the unified processor, so the else-branch fires.","commonSituations":"Switching to an experimental markdown processor while keeping old plugin config; sharing markdown config snippets between projects that use different processors.","solutions":["If the plugins must apply, switch to unified: markdown: { processor: unified({ ...plugins }) }","If the new processor is intended, delete the legacy plugin keys and configure plugins on that processor natively","Verify rendered output after migration — the plugins were silently skipped before"],"exampleFix":"// before — third-party processor ignores the legacy keys\nexport default defineConfig({\n  markdown: {\n    processor: satteri(),\n    remarkPlugins: [remarkToc], // never runs\n  },\n});\n\n// after — use a processor that runs the plugins\nimport { unified } from '@astrojs/markdown-remark';\nexport default defineConfig({\n  markdown: { processor: unified({ remarkPlugins: [remarkToc] }) },\n});","handlingStrategy":"validation","validationCode":"// invariant: legacy plugin keys only allowed with the unified processor\nconst usesUnified = config.markdown?.processor === undefined || isUnified(config.markdown?.processor);\nconst hasLegacy = ['remarkPlugins', 'rehypePlugins', 'remarkRehype'].some(\n  (k) => config.markdown?.[k] !== undefined,\n);\nif (hasLegacy && !usesUnified) {\n  throw new Error('markdown plugins set but processor does not run them');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["When swapping markdown processors, remove plugin keys you did not re-wire","Verify rendered HTML after any processor change — skipped plugins fail silently","Document which processor a project uses so config snippets are not copied across blindly"],"tags":["markdown","processor","plugins","config-mismatch"],"backgroundTag":"options-ignored-by-custom-processor","analyzedSha":"52e6c34790cc8ac4e69e6135ace06049867e5c4a","analyzedAt":"2026-08-18T18:48:03.901Z","contentChangedAt":"2026-08-18T18:48:03.901Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}