Posts, Pages, and Content Types

Posts and pages are ready the moment a site exists. When your content stops fitting either shape, you can define your own types with your own fields. This page covers both.

Posts

Posts are the site’s dated, listed, feed-published content. The Posts page lists them with title, status, and date, and lets you publish or unpublish a post inline without opening it.

Every post carries:

  • Title and Slug (the slug is generated from the title until you edit it by hand)
  • Content, written in Markdown in the post editor
  • Tags, chosen from the site’s tag list
  • A feature image with alt text and a caption
  • Status: draft, published, or archived

The SEO panel

Collapsed by default, and auto-expanded when a post already has metadata (for instance because it was created over the API or through MCP). It holds:

  • Excerpt, the short summary used in listings and feeds
  • SEO title, with a soft hint at 60 characters
  • SEO description, with a soft hint at 160 characters
  • noindex, a per-post switch

The character hints are advice, not validation. Nothing is truncated or rejected.

The GEO panel

Under the SEO panel sits a live citability score from 0 to 100, an estimate of how quotable your post is to AI search engines. It scores seven factors, weighted: headings 20, word count 15, outbound links 15, authorship 15, publication date 15, lists 10, reading level 10 (Flesch Reading Ease). Weak factors come with a specific suggestion. Pages are scored on the same dimensions minus author and date, with the score renormalised.

Preview, and working on disk

Preview renders the post through the real theme without saving it. In the desktop app the preview opens in your system browser through a single use URL.

The editor also has a disk bar: save the current post to a .md file with YAML front matter (site slug, content type, id, title, slug, status, excerpt, tags, SEO title, meta description, feature image), or open one back into the editor. An opened file loads as a new draft; the normal Save path is what writes it back to the server. Tags are not remapped from names to ids on open, so re-tag before saving.

Leaving the page with unsaved changes prompts you first.

Pages

Pages are the undated content: about, pricing, contact, landing pages. They have their own editor with two modes.

Rich text is the default. You write formatted content, the same way you would in any editor, and the build wraps it in the theme’s page template.

Tera template treats the page body as a raw Tera template. It is rendered as a template first, then wrapped in page.html. Use it for landing pages that need loops, conditionals, or theme variables.

Pages additionally support Show title (some layouts supply their own heading) and per page custom CSS and custom JS, which are revealed automatically when a page already has them.

One page can be promoted to the site homepage in Settings, Generation. When you do, the build marks it so templates can self-canonicalise to /, skip it in nav menus, and it writes a redirect from the page’s own slug URL to / so you do not end up with two homepages.

Custom content types

Custom Types in the sidebar has two sub-pages: Types (define the shape) and Tables (browse the rows).

Creating a type takes a name, a slug, an optional icon, and an optional singleton flag, then a list of fields. Fifteen field types are available:

Field typeStores
textsingle line text
long_textmulti line plain text
rich_textformatted content with HTML
numberinteger or decimal
booleantrue or false toggle
datedate without time
datetimedate with time
enumone choice from a list
jsonstructured JSON
imageimage file reference
filefile attachment
relationlink to another content type
urlweb link
emailemail address
slugURL safe identifier

Fields can be added, updated, reordered, and deleted after the fact.

How content looks over the API

All content is site scoped, and one generic controller serves posts, pages, and every custom type. The wpp_ table prefix is added for you, so posts and wpp_posts both work.

GET    /api/v1/sites/{site_slug}/content/{type}
POST   /api/v1/sites/{site_slug}/content/{type}
GET    /api/v1/sites/{site_slug}/content/{type}/{id}
PUT    /api/v1/sites/{site_slug}/content/{type}/{id}
DELETE /api/v1/sites/{site_slug}/content/{type}/{id}

The list endpoint takes page (default 1), per_page (default 20), status, and sort (for example -created_at,title). Without a sort it orders by created_at descending.

Tags have their own pair of endpoints, GET and PUT on /api/v1/sites/{site_slug}/posts/{id}/tags.

Content is only rendered into the public site by a build. See Publishing and Custom Domains.

Esc