Creating and publishing markdown content.
Scope
This playbook covers content collections — blog posts, docs, articles stored as markdown files with fixed frontmatter fields.
For custom pages with flexible fields (homepage, feature pages), see the Web Pages Architecture playbook.
Content Location
services/content/
├── config.yaml # Content source definitions
├── blog/ # Blog articles (*.md)
├── documentation/ # Documentation (*.md)
├── legal/ # Legal pages (*.md)
└── skills/ # Agent skills (*.md)
Frontmatter Template
---
title: "Article Title"
description: "Brief description for SEO (150-160 chars)"
author: "Author Name"
slug: "url-friendly-slug"
keywords: "comma, separated, keywords"
kind: "article"
image: "/files/images/blog/featured-image.webp"
public: true
tags: []
published_at: "2025-12-11"
updated_at: "2026-01-13"
links:
- title: "Reference Name"
url: "https://example.com"
after_reading_this:
- "Learning objective 1"
- "Learning objective 2"
related_playbooks:
- title: "Related Playbook"
url: "/playbooks/playbook-slug"
related_code:
- title: "Implementation File"
url: "https://github.com/org/repo/blob/main/path/file.rs#L1-L50"
---
Required Fields
| Field | Required | Notes |
|---|---|---|
title |
Yes | Page/article title |
description |
Yes | SEO description (150-160 chars) |
author |
Yes | Author name |
slug |
Yes | URL-friendly identifier |
keywords |
Yes | Can be empty string |
image |
Yes | Defaults to placeholder if missing |
kind |
Yes | Must match templates.yaml |
public |
Yes | Set to true to publish |
published_at |
Yes | ISO date format |
updated_at |
Yes | ISO date format |
Optional Relation Fields
| Field | Type | Description |
|---|---|---|
after_reading_this |
string[] |
Learning objectives readers will achieve |
related_playbooks |
{title, url}[] |
Links to related playbooks |
related_code |
{title, url}[] |
Links to code on GitHub (supports line ranges) |
links |
{title, url}[] |
External reference links |
Content Relations
Content can link to related resources for better navigation and learning paths.
Learning Objectives (after_reading_this)
List what readers will understand after reading:
after_reading_this:
- "Install the CLI from crates.io"
- "Configure local PostgreSQL"
- "Create your first profile"
Rendered as a "What you'll learn" section at the top of the page.
Related Playbooks (related_playbooks)
Link to related playbooks with title and URL:
related_playbooks:
- title: "Session Management"
url: "/playbooks/cli-session"
- title: "Cloud Setup"
url: "/playbooks/cli-cloud"
URLs should use the playbook slug format: /playbooks/{category}-{name}
Related Code (related_code)
Link to source code with optional line ranges:
related_code:
- title: "CLI Entry Point"
url: "https://github.com/org/repo/blob/main/cli/src/main.rs#L1-L50"
- title: "Config Loader"
url: "https://github.com/org/repo/blob/main/core/src/config.rs"
Line ranges use GitHub format: #L1-L50 or #L25
Content Types (kind)
| Kind | Use For |
|---|---|
article |
Most blog content |
paper |
Research, whitepapers |
guide |
How-to guides |
tutorial |
Learning materials |
page |
Static pages |
legal |
Legal documents |
URL Mapping
| Source Directory | URL Pattern |
|---|---|
services/content/blog/ |
/blog/{slug} |
services/content/documentation/ |
/documentation/{slug} |
services/content/legal/ |
/legal/{slug} |
Nested Slugs
slug: "config/profiles"
Generates: /documentation/config/profiles/
Publishing Workflow
systemprompt core content publish
Individual Steps
| Step | Command |
|---|---|
| Ingest | systemprompt core content publish --step ingest |
| Assets | systemprompt core content publish --step assets |
| Prerender | systemprompt core content publish --step prerender |
| Homepage | systemprompt core content publish --step homepage |
| Sitemap | systemprompt core content publish --step sitemap |
Content Management
systemprompt core content list --source blog --limit 20
systemprompt core content show my-article-slug --source blog
systemprompt core content search "MCP server"
systemprompt core content delete <id> --yes
Troubleshooting
| Error | Solution |
|---|---|
| No template for content type | Add mapping to templates.yaml |
| Missing field 'X' | Add field to frontmatter |
| Page data provider failed | Run --step ingest first |
Quick Reference
| Task | Command |
|---|---|
| Full publish | core content publish |
| List content | core content list --source <source> |
| Search | core content search "<query>" |
| Upload image | core files upload <path> |