Skip to content

Content and CMS

Everything a visitor can read is content you can edit without touching code: page sections, headings, buttons, labels, error messages, emails, SEO texts, photos and their alt text.

Each template describes its content once, in src/content/model.ts. The editors are generated from it, so they always offer exactly the fields your pages use:

  • Keystatic (default): your content stays in the project as Markdown and JSON files, and Keystatic is a friendly editor for them at /keystatic. No service, no extra cost. See Keystatic.
  • Sanity: your content lives in a Sanity project and your team edits it in Sanity Studio. Good when clients or several editors work on the site. See Sanity.
  • EmDash: a separate variant of the template, chosen when you create the site (wptom new my-site -t aurora --cms emdash). EmDash runs inside your site on Cloudflare, with a WordPress-like admin, and what you publish is live at once. See EmDash.

Your pages don’t change between them: the site reads the same fields from every source.

What Files
Single pages (home, pricing, waitlist, 404…) src/content/singletons/*.json
Site settings, navigation, footer src/content/singletons/site.json
Small interface texts (buttons, labels, emails) src/content/singletons/ui.json
Brand (colors, fonts, shape) src/content/singletons/brand.json
Blog, changelog, docs, legal src/content/<name>/*.md
Landing pages src/content/landing/*.json
Photos src/assets/photos/<page or collection>/ (EmDash: its media library)

In the files/Sanity variant, set CMS in .env (or in your host’s environment variables):

Terminal window
CMS=files # default: the files above, edited in Keystatic
CMS=sanity # read from your Sanity project

Content is read when the site is built, so the published site stays fast and static. After editing, the site rebuilds: with Keystatic every save is a commit, with Sanity a webhook starts the build. (In the EmDash variant, pages are rendered on request instead, so there’s no rebuild.)