{"record":{"id":"585e8d71dd86f170","repo":"gohugoio/hugo","slug":"no-content-renderer-found-for-markup-q-page-s","errorCode":null,"errorMessage":"no content renderer found for markup %q, page: %s","messagePattern":"no content renderer found for markup %q, page: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"hugolib/page__meta.go","lineNumber":990,"sourceCode":"\t\t\t\tm.pageConfig.Title = strings.Replace(s.conf.C.CreateTitle(m.pathInfo.Unnormalized().BaseNameNoIdentifier()), \"-\", \" \", -1)\n\t\t\t} else {\n\t\t\t\tm.pageConfig.Title = strings.Replace(m.pathInfo.Unnormalized().BaseNameNoIdentifier(), \"-\", \" \", -1)\n\t\t\t}\n\t\tcase kinds.KindStatus404:\n\t\t\tm.pageConfig.Title = \"404 Page not found\"\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (m *pageMeta) newContentConverter(ps *pageState, markup string) (converter.Converter, error) {\n\tif ps == nil {\n\t\tpanic(\"no Page provided\")\n\t}\n\tcp := ps.s.ContentSpec.Converters.Get(markup)\n\tif cp == nil {\n\t\treturn converter.NopConverter, fmt.Errorf(\"no content renderer found for markup %q, page: %s\", markup, ps.getPageInfoForError())\n\t}\n\n\tvar filename string\n\tvar path string\n\tif m.f != nil {\n\t\tfilename = m.f.Filename()\n\t\tpath = m.f.Path()\n\t} else {\n\t\tpath = m.Path()\n\t}\n\n\tdoc := newPageForRenderHook(ps)\n\n\tdocumentLookup := func(id uint64) any {\n\t\tif id == ps.pid {\n\t\t\t// This prevents infinite recursion in some cases.\n\t\t\treturn doc\n\t\t}","sourceCodeStart":972,"sourceCodeEnd":1008,"githubUrl":"https://github.com/gohugoio/hugo/blob/52c9bd7908b4d02d4d0ff8f82a888834d6ee10d2/hugolib/page__meta.go#L972-L1008","documentation":"Hugo could not find a content converter (renderer) for the markup type declared on a page. The converter registry at markup/markup.go:123 looks up providers by lowercased markup name; when none is registered for that name, page__meta.go:990 returns a NopConverter and this error. Built-in markup names include markdown (goldmark), asciidocext, org, pandoc, rst — the last three require the external binary to be available at build time.","triggerScenarios":"A content file declares an unsupported markup extension (e.g. .adoc, .org, .pandoc, .rst) while the corresponding external tool is not installed; a typo in the markup front matter field; a custom markup type that was never registered via markup.conversion config; or a built-in-only markup like asciidocext used without asciidoctor on PATH.","commonSituations":"Switching a site from Markdown to AsciiDoc/org-mode/RST without installing asciidoctor/emacs/pandoc; copying content from another SSG that uses an unknown markup identifier; a CI image that lacks the external converter binary; renaming a file extension to something Hugo does not map.","solutions":["Install the missing external tool matching the markup name (e.g. `gem install asciidoctor` for asciidocext, ensure pandoc is on PATH for pandoc).","Check the file extension / front matter `markup` field for typos and correct it to a registered name (markdown, asciidocext, org, pandoc, rst).","Convert the affected file to Markdown if the external tool cannot be installed in the build environment.","Register a custom converter provider if you intentionally added a new markup type."],"exampleFix":"# before (file: posts/a.adoc with no asciidoctor installed)\nmarkup: asciidocext\n\n# after: install the tool\ngem install asciidoctor\n# or rename/convert the file to Markdown\nmv posts/a.adoc posts/a.md","handlingStrategy":"validation","validationCode":"# Before building, verify each markup type used in content has a converter.\n# Markdown/asciidocext/etc.:\nfor tool in asciidoctor pandoc emacs; do command -v $tool >/dev/null || echo \"missing: $tool\"; done\n# List markup types referenced in your content:\n# find content -type f | sed 's/.*\\.//' | sort -u","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep a build-time check (CI step) that asserts required external converters (asciidoctor, pandoc, emacs) are installed when content uses those markups.","Restrict content file extensions to markdown unless an external converter is intentionally used.","Document the markup identifier (lowercase, e.g. asciidocext not asciidoc) in your project README."],"tags":["markup","content","converter","configuration"],"backgroundTag":null,"analyzedSha":"52c9bd7908b4d02d4d0ff8f82a888834d6ee10d2","analyzedAt":"2026-08-09T21:49:36.660Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}