Metadata queries do not render content. Call render() for the article you want to display:

const { html, headings } = await content.render("posts", "hello");
const body = await content.readBody("posts", "hello");

Markdown output

render() returns HTML and headings with depth, slug, and text. HTML headings have matching unique IDs, and fenced code blocks are syntax highlighted. Your application owns heading links, templates, and presentation.

Authored links and image URLs pass through unchanged. The current renderer produces HTML; MDX, asset processing, and configurable Markdown plugins are not supported yet.

Bodies and rendering policy

Markdown defaults to retainBody: true and deferRender: false. Production preparation compiles HTML eagerly, and the runtime loads each requested item's output separately. deferRender: true packages captured Markdown with the renderer for runtime compilation.

readBody() returns retained text or undefined; it never reads original source files. Missing entries reject. A body provided by a custom loader does not automatically imply Markdown rendering.

See how ContentGraph works for preparation and production boundaries.