Strand CMS

Open source · Agent-first publishing

Publishing built for agents, not editors.

Strand CMS is an open-source publishing system for programmatic blogs and news sites. Articles are MDX in Git, written and optimized by AI agents, with SEO and AI-search built into the core. No database. No CMS UI. No bloat.

npm create strand@latest

MIT · Node 20+ · macOS · Linux · Windows · read the source ↗

packages
7
skills bundled
12
MCP tools
4+
SEO·GEO artifacts
15+
databases
0

Watch the flow

From one command to indexed.

Scaffold, let the agent write, merge, and find the post in search — the whole loop in forty seconds.

Versus Ghost

Ghost gave humans an editor. We kept the 15% that earns traffic.

Everything an editor does — drafting, SEO, structured data, scheduling, publishing — an agent can now do against a well-defined contract. So Strand throws out the human-editor machinery and pushes the publishing core further than Ghost ever did, toward AI search.

What we cut

  • The database
  • The WYSIWYG editor
  • Members & subscriptions
  • Newsletters
  • Theme marketplace
  • Roles & permissions

What we kept — and pushed further

  • A validated content schema — Zod, enforced in CI and pre-commit
  • The SEO core — sitemap, JSON-LD, RSS, robots, canonical
  • Structured data, extended to GEO — llms.txt, a .md of every page, speakable, E-E-A-T
  • Git as the editorial workflow — every article a commit, publishing a PR

The artifact is the demo

One MDX file in. Fifteen crawlable artifacts out.

No screenshots needed — the product output is text. This is what a post looks like in Git, and what crawlers and AI engines see after the build.

content/posts/why-agents-publish.mdx
---
title: "Why agents publish better"
description: "SEO and AI-search from a
  schema, not a plugin."
tags: [seo, geo]
publishedAt: 2026-07-15
sources:
  - https://developers.google.com/search
---

Agents don't need a WYSIWYG.
They need a contract.
what crawlers see
<script type="application/ld+json">
{ "@type": "BlogPosting",
  "headline": "Why agents publish better",
  "author": { "@type": "Person", … },
  "speakable": { … } }
</script>

GET /blog/why-agents-publish.md
→ clean Markdown, not hydrated DOM

llms.txt · llms-full.txt · sitemap.xml
feed.xml · robots.txt · OG + Twitter

Every artifact is live on this site right now: llms.txt · llms-full.txt · sitemap.xml · feed.xml · robots.txt · this post as .md

What it is

01

MDX in Git is the source of truth

Every article is a commit - diffable, reviewable, revertible. Publishing is a pull request. There is no database to run, migrate, or back up.

schema
Zod · strict TS
gate
CI + pre-commit
publish
pull request
02

SEO + GEO baked into the core

Sitemaps, JSON-LD, RSS, robots, canonical tags - plus llms.txt and a clean .md of every page for AI search engines. Always on, never a plugin.

seo
sitemap · JSON-LD · RSS · canonical
geo
llms.txt · .md per page · speakable
emitted
statically, at build
03

Agent-first by design

A set of skills, an MCP server, and an optional Hermes editor profile let agents research, write, optimize, and publish - against a schema that won't let a malformed post merge.

skills
12 bundled
mcp
create_draft · validate_post · publish_post · get_analytics
editor
Hermes profile
04

Full site or headless

Deploy the Next.js theme as-is, or consume the typed content API from your own React/Astro frontend. The crawlable surface stays static either way.

theme
@strand/next
headless
@strand/content-api
deploy
Vercel · CF · Netlify · self-host

The agent model

Three ways to drive it. Pick one at scaffold time.

A

Skills + CLI

Marketing and native skills installed into your terminal coding agent. You review, the agent writes.

loop
human-in-the-loop
surface
your terminal agent
skills
12 · tiered
B

Skills + MCP

The strand mcp server exposes structured tools to any MCP client. Fully headless.

loop
headless
tools
create_draft · validate_post · publish_post · get_analytics
ops
real git + filesystem
A+B

Both → a Hermes editor

A dedicated agent — its own SOUL, skills, cron, and MCP connection — owns the publication and operates inside the blog repo.

profile
SOUL + config + cron
scope
owns the publication
shipped as
reproducible distribution

Safety model

Agents publish. You stay in control.

PR-only publishing

publish_post refuses to commit to the base branch, never force-pushes, and only auto-merges when the repo itself allows it.

A malformed post cannot merge

The content schema is enforced in CI and a pre-commit hook. Deploys are gated on the same validation.

No fabricated sources

The editor agent is instructed never to invent citations, and cited sources are rendered visibly on every article.

How it works

  1. 1

    Scaffold

    npm create strand@latest asks a few questions - frontend, analytics, agent mode, deploy target - and writes a ready-to-run repo with the content schema, CI validation, and your chosen adapters.

  2. 2

    Agents write

    Skills and the MCP server give an agent the tools to draft MDX, optimize for SEO and AI-search, cite sources, and open a PR. A dedicated Hermes editor can run the whole publication.

  3. 3

    Ship on merge

    Merging regenerates the static site and every SEO/GEO artifact, then deploys to Vercel, Cloudflare, Netlify, or your own box - validation-gated.

This site runs on Strand CMS

The blog below is the engine, eating its own cooking.

These posts are MDX in this repo, rendered by the same loader and SEO/GEO generators the scaffolder ships. Proof is in the plumbing: /llms.txt, /sitemap.xml, and a clean .md of any post.

All posts →

Quickstart

One command to a running publication.

npm create strand@latest

MIT · Node 20+ · macOS · Linux · Windows · read the source ↗

Requires Node 20+. Prefer to read first? The repository has the full design doc, the engine, the scaffolder, the MCP server, and the default theme.