# Content This guide is for the **site owner** (or an LLM acting for them). Edit content only. Prefer **TOON**; JSON is accepted. Do **not** edit: - `theme/**` - `aftercare.config.ts` - Generated files under `agent/` or `.cursor/skills/aftercare-*` (run `aftercare sync` instead) The authoritative per-site guide is the generated `AGENTS.md` at the site root. That file lists the section types your theme actually allows. ## Site file `content/site.toon` (or `site.json`): | Field | Required | Description | |---|---|---| | `name` | yes | Site / brand name | | `tagline` | no | Short supporting line | | `nav` | yes | At least one `{ label, href }` item | | `footer` | no | Footer text | Example: ```toon name: Northline Studio tagline: Brand sites that clients can update without calling us. nav[3]{label,href}: Home,/ Work,/work About,/about footer: Built once. Maintained with Aftercare. ``` ## Page files One file per page under `content/pages/` (`.toon` or `.json`): | Field | Required | Description | |---|---|---| | `slug` | yes | URL path: `/` or `/about` | | `title` | yes | Document / page title | | `description` | no | Meta description | | `sections` | yes | Ordered list of section blocks | Each section has a `type` matching a theme contract, plus that section’s props. Example home page: ```toon slug: / title: Home description: Northline Studio - agency sites with lasting aftercare. sections[4]: - type: hero heading: Ship the site. Skip the retainer. subheading: We build locked themes. Your team updates copy through an LLM. ctaLabel: See the work ctaHref: /work - type: features heading: Why agencies use Aftercare items[3]{title,body}: Content on rails,"TOON files + schema validation." Theme stays locked,React components ship once. Static forever,Plain HTML. Host anywhere. - type: faq heading: Common questions items[2]{q,a}: Do clients need a CMS?,No. Ask an agent to update content and rebuild. Can we still hand-edit?,Yes. TOON and JSON both work. - type: cta heading: Ready for quieter inboxes? body: Hand off a site that updates without another sprint. buttonLabel: Talk to us buttonHref: /about ``` ## Section types Allowed types come from the theme’s `sections` export. The studio starter includes: | type | Typical props | |---|---| | `hero` | `heading`; optional `subheading`, `ctaLabel`, `ctaHref` | | `features` | `heading`, `items[]` with `title`, `body` | | `faq` | `heading`, `items[]` with `q`, `a` | | `cta` | `heading`; optional `body`, `buttonLabel`, `buttonHref` | Your site may differ. Check `AGENTS.md` or `agent/catalog.toon` after sync. ## Images 1. Put files under `public/` (for example `public/images/team.webp`). 2. In content, use a root path: `/images/team.webp`. 3. Image props declared with `image()` in the theme need `src` and `alt` (and optional `width` / `height`). `validate` and `doctor` check that local paths exist and that alt text is present when required. Remote `http(s)` URLs skip the filesystem check. ## Workflow 1. Read `content/site.toon` and the target page under `content/pages/`. 2. Make the smallest change that satisfies the request. 3. Only use section types listed in `AGENTS.md`. 4. Run validate, then build: ```powershell npx aftercare validate npx aftercare build ``` From Cursor, the content skill also exposes: ```powershell node .cursor/skills/aftercare-content/scripts/validate.mjs node .cursor/skills/aftercare-content/scripts/build.mjs node .cursor/skills/aftercare-content/scripts/doctor.mjs ``` ## Adding a page 1. Add `content/pages/your-page.toon` with a unique `slug`. 2. Add a nav item in `content/site.toon` if it should appear in the header. 3. Compose sections only from allowed types. 4. Validate and build. Duplicate slugs are errors—`doctor` will fail the build. ## TOON tips - Prefer TOON over JSON for LLM edits (fewer tokens). - Quoted strings are needed when values contain commas or special characters. - Tabular rows (`items[n]{field1,field2}:`) are compact for lists of FAQ or feature cards. ## Next - [CLI reference](./cli.md) - [Deploy](./deploy.md) - [Concepts](./concepts.md)