<!DOCTYPE html>
<html class="dark">
<head>
  
  <meta charset="utf-8">
  <meta http-equiv="Content-Language" content="en">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  
  
  
  
    
  
  
  
    
  
  <title>CONTENT.md | Pages CMS</title>
  <meta name="description" content="A proposed standard for describing editable content and media in Git-based repositories."/>
  <meta name="title" content="CONTENT.md | Pages CMS">
  

  
  <link rel="icon" type="image/svg+xml" href="https://pagescms.org/assets/favicon.svg">
  <link rel="apple-touch-icon" sizes="180x180" href="https://pagescms.org/assets/apple-touch-icon.png">

  
  <meta property="og:type" content="website">
  <meta property="og:url" content="https://pagescms.org/CONTENT.md">
  <meta property="og:title" content="CONTENT.md | Pages CMS">
  <meta property="og:description" content="A proposed standard for describing editable content and media in Git-based repositories.">
  <meta property="og:image" content="https://pagescms.org/assets/social-card.png">
  <meta property="og:site_name" content="Pages CMS">
  <meta property="og:locale" content="en_US">

  
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:url" content="https://pagescms.org/CONTENT.md">
  <meta name="twitter:title" content="CONTENT.md | Pages CMS">
  <meta name="twitter:description" content="A proposed standard for describing editable content and media in Git-based repositories.">
  <meta name="twitter:image" content="https://pagescms.org/assets/social-card.png">
  <meta name="twitter:creator" content="@pagescms">

  
  <link rel="stylesheet" href="/assets/styles.css">

  
  <script src="/assets/htmx.min.js" defer></script>
  <script src="/assets/basecoat.min.js" defer></script>
  <script src="/assets/copy-code.js" defer></script>
  <script src="/assets/alpine.min.js" defer></script>

  
</head>
<body>
  
    <div aria-hidden="true" class="page-wash"></div>
  
  
<header class="max-w-7xl mx-auto px-6 lg:px-8 py-4 flex items-center gap-2 transition-colors" :class="{ 'max-sm:bg-background': isMobileOpen }" x-data="{ isMobileOpen: false }">
  <a href="/" class="flex items-center justify-center mr-auto gap-3 font-semibold text-sm">
    <div class="[&>svg]:size-4 bg-primary text-primary-foreground rounded-md size-6 flex items-center justify-center">
      <svg className="size-3" viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path d="M0 4.8C0 2.14903 2.14903 0 4.8 0H12.0118C13.2848 0 14.5057 0.505713 15.4059 1.40589L22.5941 8.59411C23.4943 9.49429 24 10.7152 24 11.9882V19.2C24 21.851 21.851 24 19.2 24H4.8C2.14903 24 0 21.851 0 19.2V4.8Z"></path></svg>
    </div>
    Pages CMS
  </a>

  <nav class="items-center gap-2 hidden sm:flex">
    <a
      href="/"
      class="max-sm:w-full btn-sm-ghost "
      
    >
        Home
    </a>
    <a
      href="/docs"
      class="max-sm:w-full btn-sm-ghost "
      
    >
      Docs
    </a>
    <a class="max-sm:w-full btn-sm-icon-ghost" href="https://pagescms.org/chat" target="_blank" data-tooltip="Discord" data-side="bottom">
      <svg role="img" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Discord</title><path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z"/></svg>

    </a>
    <a class="max-sm:w-full btn-sm-icon-ghost" href="https://github.com/pages-cms/pages-cms" target="_blank" data-tooltip="GitHub" data-side="bottom">
      <svg role="img" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
    </a>
    <a class="max-sm:w-full btn-sm-outline" href="https://app.pagescms.org">Sign in</a>
  </nav>

  <div class="sm:hidden">
    <button type="button" class="btn-sm-icon-outline" @click="isMobileOpen = !isMobileOpen">
      <span x-show="!isMobileOpen" x-cloak><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 5h16" /><path d="M4 12h16" /><path d="M4 19h16" /></svg></span>
      <span x-show="isMobileOpen" x-cloak><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18" /><path d="m6 6 12 12" /></svg></span>
    </button>
    <nav class="fixed inset-0 top-16 bg-background z-50 flex flex-col gap-2 p-4 transition-all opacity-0 scale-95 -translate-y-16 invisible" :class="{ 'opacity-100 scale-100 translate-y-0 visible': isMobileOpen }" x-cloak>
      <a class="btn-lg-ghost justify-between px-4" href="/">
        Home
      </a>
      <a class="btn-lg-ghost justify-between px-4" href="/docs">
        Docs
      </a>
      <a class="btn-lg-ghost justify-between" href="https://pagescms.org/chat">
        Discord
        <svg role="img" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Discord</title><path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z"/></svg>
      </a>
      <a class="btn-lg-ghost justify-between" href="https://github.com/pages-cms/pages-cms">
        GitHub
        <svg role="img" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
      </a>
      <a class="btn-lg-ghost justify-between" href="https://app.pagescms.org">
        Sign in
        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg>
      </a>
    </nav>
  </div>
</header>


<article class="mx-auto my-24 px-4 max-w-3xl">
  <header class="text-center mb-12 max-w-2xl mx-auto">
    <h2 class="text-2xl font-semibold tracking-tight sm:text-3xl xl:text-4xl">CONTENT.md</h2>
  </header>

  <section class="prose text-foreground/80">
    <h2 id="what-content.md-is-for" tabindex="-1"><a class="header-anchor" href="#what-content.md-is-for">What <code>CONTENT.md</code> is for</a></h2>
<p><code>CONTENT.md</code> is a proposed standard for describing the editable content and media structure of a repository.</p>
<p>It is intended for:</p>
<ul>
<li>contributors editing content directly in Git,</li>
<li>AI agents making content changes in a repository,</li>
<li>CMSs and tooling that need a portable content contract.</li>
</ul>
<p>The goal is simple: make it clear what content exists, where it lives, how it is shaped, and where media belongs.</p>
<h2 id="why-it-exists" tabindex="-1"><a class="header-anchor" href="#why-it-exists">Why it exists</a></h2>
<p>Many repositories already contain content and media in files, but only the site owner or CMS knows the actual rules:</p>
<ul>
<li>which directories hold content,</li>
<li>which files are singleton documents,</li>
<li>how new entries should be named,</li>
<li>which fields exist,</li>
<li>which values are required,</li>
<li>where media can be uploaded.</li>
</ul>
<p>That is usually enough to confuse contributors and agents.</p>
<p><code>CONTENT.md</code> gives repositories a predictable, human-readable file that explains the content model without requiring knowledge of a specific CMS.</p>
<h2 id="what-it-should-describe" tabindex="-1"><a class="header-anchor" href="#what-it-should-describe">What it should describe</a></h2>
<p>A <code>CONTENT.md</code> file should describe only the declared content model of a repository.</p>
<p>It should focus on repository semantics such as:</p>
<ul>
<li>collections of entries,</li>
<li>singleton files,</li>
<li>media libraries,</li>
<li>field definitions,</li>
<li>filename patterns,</li>
<li>formats and serialization,</li>
<li>defaults and validation constraints.</li>
</ul>
<p>It should not include UI-only details such as navigation, layout preferences, or editor presentation unless they affect the stored repository data.</p>
<h2 id="core-concepts" tabindex="-1"><a class="header-anchor" href="#core-concepts">Core concepts</a></h2>
<h3 id="collection" tabindex="-1"><a class="header-anchor" href="#collection">Collection</a></h3>
<p>A set of content entries stored under a path, usually with a filename pattern.</p>
<p>Examples:</p>
<ul>
<li>blog posts in <code>content/posts</code></li>
<li>docs pages in <code>docs/articles</code></li>
</ul>
<h3 id="file" tabindex="-1"><a class="header-anchor" href="#file">File</a></h3>
<p>A single content document stored at a fixed path.</p>
<p>Examples:</p>
<ul>
<li><code>content/pages/home.md</code></li>
<li><code>src/data/site.json</code></li>
</ul>
<h3 id="media-library" tabindex="-1"><a class="header-anchor" href="#media-library">Media library</a></h3>
<p>A configured path where media files may be stored and referenced by content.</p>
<p>Examples:</p>
<ul>
<li><code>public/uploads</code></li>
<li><code>assets/images</code></li>
</ul>
<h3 id="field" tabindex="-1"><a class="header-anchor" href="#field">Field</a></h3>
<p>A named piece of content data stored in a collection entry or singleton file.</p>
<p>Examples:</p>
<ul>
<li><code>title</code></li>
<li><code>date</code></li>
<li><code>description</code></li>
<li><code>image</code></li>
</ul>
<h2 id="how-it-works" tabindex="-1"><a class="header-anchor" href="#how-it-works">How it works</a></h2>
<p>A repository that adopts the standard adds a <code>CONTENT.md</code> file at its root.</p>
<p>That file describes:</p>
<ol>
<li>what content types exist,</li>
<li>where they are stored,</li>
<li>what fields they contain,</li>
<li>what rules apply when creating or updating them,</li>
<li>where media may be uploaded.</li>
</ol>
<p>The file may be:</p>
<ul>
<li>maintained by hand,</li>
<li>generated from a CMS configuration file,</li>
<li>or produced by another content tool.</li>
</ul>
<p>If the file is generated, it should say what the authoritative source is.</p>
<h2 id="example" tabindex="-1"><a class="header-anchor" href="#example">Example</a></h2>
<pre class="language-md"><code class="language-md"><span class="token title important"><span class="token punctuation">#</span> CONTENT.md</span>

This file describes the editable content and media structure of this repository.

<span class="token title important"><span class="token punctuation">##</span> Collections</span>

<span class="token title important"><span class="token punctuation">###</span> posts</span>

Path: <span class="token code-snippet code keyword">`content/posts`</span>
Format: <span class="token code-snippet code keyword">`yaml-frontmatter + markdown body`</span>
Filename: <span class="token code-snippet code keyword">`{year}-{month}-{day}-{primary}.md`</span>

Fields:
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`title`</span>: string, required
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`date`</span>: date, required
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`description`</span>: string, optional
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`draft`</span>: boolean, default <span class="token code-snippet code keyword">`false`</span>
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`image`</span>: image reference, optional

<span class="token title important"><span class="token punctuation">##</span> Files</span>

<span class="token title important"><span class="token punctuation">###</span> home</span>

Path: <span class="token code-snippet code keyword">`content/pages/home.md`</span>
Format: <span class="token code-snippet code keyword">`yaml-frontmatter + markdown body`</span>

Fields:
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`title`</span>: string, required
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`hero_title`</span>: string, optional
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`hero_text`</span>: text, optional

<span class="token title important"><span class="token punctuation">##</span> Media libraries</span>

<span class="token title important"><span class="token punctuation">###</span> default</span>

Input path: <span class="token code-snippet code keyword">`public/uploads`</span>
Public path: <span class="token code-snippet code keyword">`/uploads`</span>
Allowed extensions:
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`.jpg`</span>
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`.jpeg`</span>
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`.png`</span>
<span class="token list punctuation">-</span> <span class="token code-snippet code keyword">`.webp`</span></code></pre>
<h2 id="generating-content.md-from-pages-cms" tabindex="-1"><a class="header-anchor" href="#generating-content.md-from-pages-cms">Generating <code>CONTENT.md</code> from Pages CMS</a></h2>
<p>Pages CMS can generate a <code>CONTENT.md</code> file from repository configuration.</p>
<p>When generated from Pages CMS, the mapping is straightforward:</p>
<ul>
<li><code>content</code> collections become collection sections,</li>
<li><code>content</code> files become file sections,</li>
<li><code>media</code> definitions become media library sections,</li>
<li>field definitions become field descriptions,</li>
<li>defaults and constraints are carried over when they affect repository data.</li>
</ul>
<p>UI-only configuration such as navigation or view settings should be omitted unless it changes the actual stored content shape.</p>
<h2 id="design-principles" tabindex="-1"><a class="header-anchor" href="#design-principles">Design principles</a></h2>
<p>If you implement this standard, keep it:</p>
<ul>
<li>CMS-neutral,</li>
<li>repository-focused,</li>
<li>readable without prior product knowledge,</li>
<li>structured enough for agents to follow reliably,</li>
<li>concise enough to remain useful in real repositories.</li>
</ul>
<h2 id="status" tabindex="-1"><a class="header-anchor" href="#status">Status</a></h2>
<p><code>CONTENT.md</code> is currently presented here as a proposed open convention.</p>
<p>Pages CMS aims to support generating it automatically from repository configuration, but the format is intended to be usable by any CMS or Git-based content workflow.</p>

  </section>
</article>

<footer class="flex items-center justify-center gap-x-4 text-muted-foreground px-6 lg:px-8 py-8 text-xs [&_a]:hover:underline">
  <span>© <a href="https://ronanberder.com">Ronan Berder</a></span>
  <a href="/terms">Terms</a>
  <a href="/privacy">Privacy</a>
</footer>

</body>
</html>
