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>