Adds Markdown fields and blocks to Payload collections, edited in a CodeMirror editor and rendered on the server with Shiki highlighting. Content stays portable Markdown, with directives for callouts, cards, buttons, tabs and column layouts, plus themes, icon packs and palettes. It can also plug into the official Payload MCP plugin so AI agents can read, validate and edit content as drafts. Styling works best with Tailwind Typography.
Structured Markdown editing and rendering for Payload CMS with CodeMirror, Shiki, directives, themes, and server-first output.
Installation
npm i @valkyrianlabs/payload-markdown8
Stars
0
Forks
1
Open Issues
2 days ago
Last Updated
0
Weekly Downloads
v1.8.1
npm Version
1.7 MB
Unpacked Size
39
Dependencies
Trends appear after 7 days of data. Daily snapshots have not started yet.
Trends appear after 7 days of data. Daily snapshots have not started yet.
Each point is npm's rolling 7-day download count.
Health Score
Composite score based on GitHub activity, stars, npm downloads, publish recency, dependency count, and package size.
Badge for your README
[](https://payloaddirectory.dev/plugins/1197676810-root)<a href="https://payloaddirectory.dev/plugins/1197676810-root"><img src="https://payloaddirectory.dev/badge/1197676810-root.svg" alt="Payload Directory"></a>README
@valkyrianlabs/payload-markdown
Structured Markdown editing and rendering for Payload CMS.
payload-markdown gives Payload a Markdown-first authoring system with a CodeMirror editor, Shiki-powered code blocks, registry-backed directives, local SVG icon packs, buttons, cards, table-of-contents generation, autocomplete, diagnostics, and server-first rendering.
No bloated rich text editor.
No JSON-shaped content prison.
No MDX ceremony for common docs/blog layouts.
Just portable Markdown that renders like a real system.
Payload Markdown now feels much closer to a Markdown-native design system: readable [Title] directive labels, expanded multiline args, local icon packs, button primitives, smarter autocomplete, richer card linking, and editor readability aids without giving up portable Markdown.
New in v1.7: AI agents can manage your content. Connect Claude, Cursor, or any MCP client to your Payload app and ask for changes in plain language.
pnpm add payload-markdown
[!IMPORTANT] Install the agent skill. If you use Payload MCP or let AI agents (Claude Code, Codex) work in your repo, install the skill that ships with the package so they know every directive, theme and the MCP workflow:
npx payload-markdown skill installRun it again after upgrading.
npx payload-markdown skill checkfails when the installed skill has drifted from the package, and agents are told to suggest the update when they notice.
payload-markdown is also published as @valkyrianlabs/payload-markdown: the same package, built once and released at the same version, and still fully supported. Import from whichever name you installed (@valkyrianlabs/payload-markdown/server instead of payload-markdown/server, and so on), and install only one of them.
"Rewrite the Home page from our launch post. Use cards for the features and add an FAQ after the hero."
Say that to Claude, Cursor, or any MCP client, and it gets done. The agent finds the page, writes payload-markdown using the directives, themes, icons, and code languages your site actually has, validates every block with your renderer, and saves a draft for you to review in the admin.
payload-markdown/mcp plugs into Payload's official @payloadcms/plugin-mcp:
import { mcpPlugin } from '@payloadcms/plugin-mcp'
import { payloadMarkdown } from 'payload-markdown'
import { withPayloadMarkdownMcp } from 'payload-markdown/mcp'
export default buildConfig({
plugins: [
payloadMarkdown({ collections: { pages: true, posts: true } }),
mcpPlugin(
withPayloadMarkdownMcp({
collections: { pages: { enabled: true }, posts: { enabled: true } },
}),
),
],
})
Create an API key in the admin (MCP → API Keys), then connect your agent:
claude mcp add --transport http payload http://localhost:3000/api/mcp \
--header "Authorization: Bearer <key>"
| Tool | What the agent gets |
|---|---|
markdownGuide | A site-aware authoring guide, generated live from your config: where markdown lives, your themes, icons, and code languages, every directive and attribute. |
markdownRead | Find documents by id, title, slug, or query and see every markdown field and block with stable refs. |
markdownValidate | Render-exact validation with line and column diagnostics. |
markdownWrite | Atomic replace, insert, and remove edits. Validated first, saved as a draft, other blocks untouched. |
markdownPublish | Publish the draft, only when you ask. |
Built to be trusted with a real site:
ifUpdatedAt refuses stale writes, and open (locked) documents are respected.The package also ships an agent skill so Claude Code and Codex know the workflow out of the box: npx payload-markdown skill install (see Install).
Full setup, directive syntax, theme configuration, code block options, editor behavior, and migration notes live in the docs.
Most CMS content systems eventually force you into one of two weak paths:
This plugin takes the third path:
Write fast. Render clean. Stay in control.
::button leaf directives and :::buttons groups@pack/namelinkScope and newTab controls for card and cards layoutsPayload Markdown directive preview
payload-markdown renders structured Markdown directly inside the Payload admin preview, including callouts, details, TOCs, steps, cards, buttons, tabs, themes, icons, and code blocks — without turning your content into JSON-shaped sludge.
New examples prefer labels for visible titles and expanded attrs for anything non-trivial:
:::card[Fast Setup]{
href="/getting-started/installation"
linkScope="title"
icon="@fa-duotone/bolt"
}
Install, configure, ship.
:::buttons{
align="center"
stack="mobile"
gap="md"
}
::button[Read Docs]{
href="/docs"
variant="primary"
icon="@fa-duotone/book-open"
}
::button[GitHub]{
href="https://github.com/valkyrianlabs/payload-markdown"
variant="secondary"
icon="@brand/github"
newTab=true
}
:::
:::
The older title="" form remains compatible, but [Title] keeps visible content out of the argument list. Card and cards directives support scoped linking through linkScope; use linkScope="title" when a card body contains buttons or links.
Editor completion can expose shortcuts such as ::button, ::button_icon, and ::button_full, but generated Markdown always uses the canonical ::button directive. Syntax highlighting now distinguishes directive names, labels, arg names, arg values, and leaf-vs-container directives, while closing labels make nested ::: blocks easier to scan.
Payload Markdown supports structured directives for real content layouts:
:::callout:::details:::toc:::steps:::cards:::card::button:::buttons:::tabs:::tab:::section:::2col:::3col:::cellDirectives are plain Markdown. They stay readable in Git, easy to review in PRs, and simple for AI/editor tooling to maintain.
See the docs for directive syntax, supported attributes, nesting behavior, themes, and examples:
Directive themes are first-class.
Themes live beside config, not inside it. Theme objects use classes, not className.
Default themes are included automatically. You only define custom themes when you want to extend or override the built-ins.
Themes can be configured globally or scoped per collection, then selected directly from Markdown using directive attributes.
Stable classes and data attributes are emitted for overrides, including data-directive, data-theme, and vl-md-* hook classes.
Palettes are named colour themes that colour individual icons and recolour directives, on top of their structural theme:
:::card[Linux]{icon="@fa-brands/debian palette=debian, @fa-brands/ubuntu palette=ubuntu" theme="glass"}
Debian and Ubuntu support.
:::
Each icon carries its own palette, so order never swaps colours. Palettes paint the SVG itself (brand icons, duotone layers, explicit fills), follow light and dark mode, and come built in for every Tailwind hue. Define more in code, or enable appearance: true to manage them in the admin and over MCP at runtime, without CSS or a rebuild.
Code block rendering has its own top-level code namespace.
Use it to configure Shiki languages, the Shiki theme, line numbers, enhanced rendering, and full-bleed code behavior.
Legacy config.options still works, but code is the preferred API.
Migration mapping:
config.options.langs → code.langsconfig.options.lineNumbers → code.lineNumbersconfig.options.theme → code.shikiThemeconfig.options.enhancedCodeBlocks → code.enhancedconfig.fullBleedCode → code.fullBleedRegister the plugin in your Payload config, enable it for one or more collections, then render Markdown content with the server renderer.
The full setup guide covers:
The editor is built on CodeMirror and includes:
::button_iconThe goal is simple: author Markdown like text, but get enough tooling that complex docs stay pleasant.
For best rendering defaults, enable Tailwind Typography and scan the plugin output.
Required pieces:
@tailwindcss/typographydist directory to Tailwind sources@custom-variant dark so the Markdown output follows itTheme class strings defined in your app config should also live in scanned source files.
Runtime arbitrary Tailwind classes inside CMS-authored Markdown are not the recommended styling path. Use directive theme="..." values and configure named themes in source.
Use one Markdown field to author:
The content stays readable in Git and editable in Payload.
If that aligns with how you build, this will feel right.
richtext
Rich-text child block, default Lexical editor preset and JSX renderer for Atomic Payload
610/wk37v3
payload lexical typography
Lexical editor features for text color, font size, letter spacing, line height and font family
571.1k/wk109v?
payload editor
Preset-based, deterministic configuration builder for the Payload Lexical rich text editor
564/wk2v3
payload richtext lexical react native
React Native renderer for serialized Lexical rich text content from Payload CMS
420/wk0v3
payload callouts
Callout block for the Lexical editor with GitHub and Obsidian themes and server-rendered output
180/wk1v3
fullscreen editor
Fullscreen mode for the Payload Lexical rich text editor
680/wk114v3