SkillsPage system
Build page templates that crawlers and assistants read well
An agent skill for the repository a site is built in. It names each kind of page, builds the shared frame once, gives every page one outline and the structured data for its kind, links the pages into hubs, and proves each pattern on the live pages with mttr. It is about the structure under a page: the look stays yours.
Version 1.3.1Updated October 23, 2026
What it does
It works on the templates, not page by page: one shared frame, one outline and the right structured data for each kind of page, then a live page of each template checked with mttr.
- 1Name each kind of pageList every template and say which kind of page each one makes.
File /services/ - 2Build the frame oncePut everything every page needs in the shared layout, so no template can forget it.
HTML <html lang> - 3Give every page one outlineEach page has exactly one
h1that says what the page is about, thenh2andh3in order, never skipping a level for size.File https://mttr.si/h1-checker?url=<page> - 4Write the structured data for its kindEach template writes one JSON-LD graph that says what the page is, from the same data the page shows.
Call mttr_schema_create({ type, fields }) - 5Link the pages into hubsMake the site a tree a crawler can walk: home, then hubs, then the pages under them.
HTML <a href> - 6Build the parts that carry weightEach of these is a component with one job. The patterns are in references/components.md.
HTML <time datetime> - 7Set the spacingPut every page on one spacing scale with an even rhythm, so a reader sees what belongs together and where each part ends.
Terminal node scripts/measure.mjs <page> - 8Prove it with mttrShip as the person allows, then check each pattern on a live page of each template.
File https://mttr.si/og-image-checker?url=<page>
mttr_pages({ site: "example.com", failing: "one-h1" })the pages a rule still fails, which points at the template
Kinds of page
Each template is named as one kind of page before anything changes, because mttr gives each kind its own rules. references/page-kinds.md has a template for each.
| Kind | What it is | How mttr knows it |
|---|---|---|
| Home | The site's front page | The address / |
| Service or product | One offer: a service, a product, a location served | An address under /services/, /service-area/, /locations/ or /products/, or Service or Product in its structured data |
| Article | A guide, a post, a how-to | An address under /guides/, /blog/, /articles/, /news/, /resources/ or /learn/, or an Article type in its structured data |
| Hub | A list of pages of one kind, such as `/services` | Read as a plain page |
| Plain page | About, contact, pricing, policies, authors | Anything else |
What it proves
Each pattern and the 38 mttr rules that check it on the live page, with the free check for one page. The rules are read from the rulebook, not restated: mttr_rules and the rulebook give each one's wording.
| Pattern | mttr rules | Check one page with no key |
|---|---|---|
| The frame |
| https://mttr.si/og-image-checker?url=<page> |
| One outline |
| https://mttr.si/h1-checker?url=<page> |
| Structured data |
| https://mttr.si/schema-checker?url=<page> |
| Links and hubs |
| https://mttr.si/redirect-checker?url=<page> |
| Distinct pages |
| https://mttr.si/agent-view?url=<page> |
| Parts that carry weight |
| the site's report |
| Speed |
| https://mttr.si/website-speed-test?url=<page> |
| llms.txt |
| https://mttr.si/ai-crawler-checker?url=<domain> |
Read every rule in the rulebook
When to use it
Reach for it when
- You are building a new site, or a new kind of page, and want it right from the first template.
- mttr’s findings point at many pages made from one template.
- You are reworking a layout, a component library or a design system and want its HTML sound.
Leave it when
- You want a new look. This changes what is under the page and puts its spacing on one scale, never its color, type or brand.
- The job is product data on a shop: the shop ready skill covers it field by field.
- You want copy written. The patterns say where the answer goes; the words come from the site.
Your agent loads it when a request matches the description in SKILL.md, or when you call it by name. A request like this one does:
Rework our page templates so every page has one h1, the right structured data and a breadcrumb, then check them with mttr.The description your agent matches
Builds a site's page templates and shared components so search engines and AI assistants read every page well, and proves each pattern with mttr. Covers one h1 and a real outline, landmarks, an answer-first opening, structured data for each kind of page, share tags, canonical and indexing, internal links and hubs, images, speed and contrast, spacing on one scale with an even rhythm, and moving an existing site onto it a template at a time. Use when building or reworking a site's layout, page templates, components or design system, adding a new kind of page, or when mttr findings point at a shared template. About the structure of pages and their spacing, not their colour, type or brand.
What it calls
The 14 mttr tools its files call over MCP, in the order they first appear. Each links to its entry in the API reference.
- mttr_site
- mttr_brief
- mttr_pages
- mttr_schema_create
- mttr_structure
- mttr_rules
- mttr_rescan
- mttr_job
- mttr_changes
- mttr_product_check
- mttr_page
- mttr_agent_view
- mttr_map
- mttr_links
And 12 addresses on mttr.si an agent can reach with no key:
/report/<domain>/tools/og-image-checker?url=<page>/h1-checker?url=<page>/agent-view?url=<page>/schema-checker?url=<page>/redirect-checker?url=<page>/website-speed-test?url=<page>/ai-crawler-checker?url=<domain>/rulebook/schema-generator/redirect-checker?url=<old
Install it
The skill is a folder, mttr-page-system, with 12 files. Run the commands from the top of the site's repository, so everyone who works in it gets the skill. Your agent also needs mttr connected over MCP for the calls above: connecting an agent shows how.
Claude Code
Loads skills from .claude/skills/ in the repository, for everyone who works in it, or ~/.claude/skills/ for every project on your machine. Claude uses it when a request matches its description, or type /mttr-page-system.
mkdir -p .claude/skills/mttr-page-system/references .claude/skills/mttr-page-system/scripts
curl -fsSL https://mttr.si/skills/page-system/SKILL.md -o .claude/skills/mttr-page-system/SKILL.md
curl -fsSL https://mttr.si/skills/page-system/references/page-kinds.md -o .claude/skills/mttr-page-system/references/page-kinds.md
curl -fsSL https://mttr.si/skills/page-system/references/structured-data.md -o .claude/skills/mttr-page-system/references/structured-data.md
curl -fsSL https://mttr.si/skills/page-system/references/components.md -o .claude/skills/mttr-page-system/references/components.md
curl -fsSL https://mttr.si/skills/page-system/references/outline-and-accessibility.md -o .claude/skills/mttr-page-system/references/outline-and-accessibility.md
curl -fsSL https://mttr.si/skills/page-system/references/links-and-hubs.md -o .claude/skills/mttr-page-system/references/links-and-hubs.md
curl -fsSL https://mttr.si/skills/page-system/references/images-and-speed.md -o .claude/skills/mttr-page-system/references/images-and-speed.md
curl -fsSL https://mttr.si/skills/page-system/references/spacing.md -o .claude/skills/mttr-page-system/references/spacing.md
curl -fsSL https://mttr.si/skills/page-system/references/spacing-traits.md -o .claude/skills/mttr-page-system/references/spacing-traits.md
curl -fsSL https://mttr.si/skills/page-system/scripts/measure.mjs -o .claude/skills/mttr-page-system/scripts/measure.mjs
curl -fsSL https://mttr.si/skills/page-system/references/migration.md -o .claude/skills/mttr-page-system/references/migration.md
curl -fsSL https://mttr.si/skills/page-system/references/troubleshooting.md -o .claude/skills/mttr-page-system/references/troubleshooting.mdNew-Item -ItemType Directory -Force .claude\skills\mttr-page-system\references | Out-Null
New-Item -ItemType Directory -Force .claude\skills\mttr-page-system\scripts | Out-Null
Invoke-WebRequest https://mttr.si/skills/page-system/SKILL.md -OutFile .claude\skills\mttr-page-system\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/page-kinds.md -OutFile .claude\skills\mttr-page-system\references\page-kinds.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/structured-data.md -OutFile .claude\skills\mttr-page-system\references\structured-data.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/components.md -OutFile .claude\skills\mttr-page-system\references\components.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/outline-and-accessibility.md -OutFile .claude\skills\mttr-page-system\references\outline-and-accessibility.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/links-and-hubs.md -OutFile .claude\skills\mttr-page-system\references\links-and-hubs.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/images-and-speed.md -OutFile .claude\skills\mttr-page-system\references\images-and-speed.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/spacing.md -OutFile .claude\skills\mttr-page-system\references\spacing.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/spacing-traits.md -OutFile .claude\skills\mttr-page-system\references\spacing-traits.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/scripts/measure.mjs -OutFile .claude\skills\mttr-page-system\scripts\measure.mjs -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/migration.md -OutFile .claude\skills\mttr-page-system\references\migration.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/troubleshooting.md -OutFile .claude\skills\mttr-page-system\references\troubleshooting.md -UseBasicParsingPuts the files in .claude/skills/mttr-page-system/.
Codex
Loads skills from .agents/skills/ in the repository and its parent folders, or ~/.agents/skills/ for every project. Codex uses it when a task matches its description, or mention it as $mttr-page-system; /skills lists them.
mkdir -p .agents/skills/mttr-page-system/references .agents/skills/mttr-page-system/scripts
curl -fsSL https://mttr.si/skills/page-system/SKILL.md -o .agents/skills/mttr-page-system/SKILL.md
curl -fsSL https://mttr.si/skills/page-system/references/page-kinds.md -o .agents/skills/mttr-page-system/references/page-kinds.md
curl -fsSL https://mttr.si/skills/page-system/references/structured-data.md -o .agents/skills/mttr-page-system/references/structured-data.md
curl -fsSL https://mttr.si/skills/page-system/references/components.md -o .agents/skills/mttr-page-system/references/components.md
curl -fsSL https://mttr.si/skills/page-system/references/outline-and-accessibility.md -o .agents/skills/mttr-page-system/references/outline-and-accessibility.md
curl -fsSL https://mttr.si/skills/page-system/references/links-and-hubs.md -o .agents/skills/mttr-page-system/references/links-and-hubs.md
curl -fsSL https://mttr.si/skills/page-system/references/images-and-speed.md -o .agents/skills/mttr-page-system/references/images-and-speed.md
curl -fsSL https://mttr.si/skills/page-system/references/spacing.md -o .agents/skills/mttr-page-system/references/spacing.md
curl -fsSL https://mttr.si/skills/page-system/references/spacing-traits.md -o .agents/skills/mttr-page-system/references/spacing-traits.md
curl -fsSL https://mttr.si/skills/page-system/scripts/measure.mjs -o .agents/skills/mttr-page-system/scripts/measure.mjs
curl -fsSL https://mttr.si/skills/page-system/references/migration.md -o .agents/skills/mttr-page-system/references/migration.md
curl -fsSL https://mttr.si/skills/page-system/references/troubleshooting.md -o .agents/skills/mttr-page-system/references/troubleshooting.mdNew-Item -ItemType Directory -Force .agents\skills\mttr-page-system\references | Out-Null
New-Item -ItemType Directory -Force .agents\skills\mttr-page-system\scripts | Out-Null
Invoke-WebRequest https://mttr.si/skills/page-system/SKILL.md -OutFile .agents\skills\mttr-page-system\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/page-kinds.md -OutFile .agents\skills\mttr-page-system\references\page-kinds.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/structured-data.md -OutFile .agents\skills\mttr-page-system\references\structured-data.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/components.md -OutFile .agents\skills\mttr-page-system\references\components.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/outline-and-accessibility.md -OutFile .agents\skills\mttr-page-system\references\outline-and-accessibility.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/links-and-hubs.md -OutFile .agents\skills\mttr-page-system\references\links-and-hubs.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/images-and-speed.md -OutFile .agents\skills\mttr-page-system\references\images-and-speed.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/spacing.md -OutFile .agents\skills\mttr-page-system\references\spacing.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/spacing-traits.md -OutFile .agents\skills\mttr-page-system\references\spacing-traits.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/scripts/measure.mjs -OutFile .agents\skills\mttr-page-system\scripts\measure.mjs -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/migration.md -OutFile .agents\skills\mttr-page-system\references\migration.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/troubleshooting.md -OutFile .agents\skills\mttr-page-system\references\troubleshooting.md -UseBasicParsingPuts the files in .agents/skills/mttr-page-system/.
Cursor
Loads skills from .cursor/skills/ or .agents/skills/ in the repository, or ~/.cursor/skills/ for every project. It also reads .claude/skills/, so one copy there serves both. The agent uses it when it is relevant, or type / in Agent chat and pick it.
mkdir -p .cursor/skills/mttr-page-system/references .cursor/skills/mttr-page-system/scripts
curl -fsSL https://mttr.si/skills/page-system/SKILL.md -o .cursor/skills/mttr-page-system/SKILL.md
curl -fsSL https://mttr.si/skills/page-system/references/page-kinds.md -o .cursor/skills/mttr-page-system/references/page-kinds.md
curl -fsSL https://mttr.si/skills/page-system/references/structured-data.md -o .cursor/skills/mttr-page-system/references/structured-data.md
curl -fsSL https://mttr.si/skills/page-system/references/components.md -o .cursor/skills/mttr-page-system/references/components.md
curl -fsSL https://mttr.si/skills/page-system/references/outline-and-accessibility.md -o .cursor/skills/mttr-page-system/references/outline-and-accessibility.md
curl -fsSL https://mttr.si/skills/page-system/references/links-and-hubs.md -o .cursor/skills/mttr-page-system/references/links-and-hubs.md
curl -fsSL https://mttr.si/skills/page-system/references/images-and-speed.md -o .cursor/skills/mttr-page-system/references/images-and-speed.md
curl -fsSL https://mttr.si/skills/page-system/references/spacing.md -o .cursor/skills/mttr-page-system/references/spacing.md
curl -fsSL https://mttr.si/skills/page-system/references/spacing-traits.md -o .cursor/skills/mttr-page-system/references/spacing-traits.md
curl -fsSL https://mttr.si/skills/page-system/scripts/measure.mjs -o .cursor/skills/mttr-page-system/scripts/measure.mjs
curl -fsSL https://mttr.si/skills/page-system/references/migration.md -o .cursor/skills/mttr-page-system/references/migration.md
curl -fsSL https://mttr.si/skills/page-system/references/troubleshooting.md -o .cursor/skills/mttr-page-system/references/troubleshooting.mdNew-Item -ItemType Directory -Force .cursor\skills\mttr-page-system\references | Out-Null
New-Item -ItemType Directory -Force .cursor\skills\mttr-page-system\scripts | Out-Null
Invoke-WebRequest https://mttr.si/skills/page-system/SKILL.md -OutFile .cursor\skills\mttr-page-system\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/page-kinds.md -OutFile .cursor\skills\mttr-page-system\references\page-kinds.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/structured-data.md -OutFile .cursor\skills\mttr-page-system\references\structured-data.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/components.md -OutFile .cursor\skills\mttr-page-system\references\components.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/outline-and-accessibility.md -OutFile .cursor\skills\mttr-page-system\references\outline-and-accessibility.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/links-and-hubs.md -OutFile .cursor\skills\mttr-page-system\references\links-and-hubs.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/images-and-speed.md -OutFile .cursor\skills\mttr-page-system\references\images-and-speed.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/spacing.md -OutFile .cursor\skills\mttr-page-system\references\spacing.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/spacing-traits.md -OutFile .cursor\skills\mttr-page-system\references\spacing-traits.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/scripts/measure.mjs -OutFile .cursor\skills\mttr-page-system\scripts\measure.mjs -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/migration.md -OutFile .cursor\skills\mttr-page-system\references\migration.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/troubleshooting.md -OutFile .cursor\skills\mttr-page-system\references\troubleshooting.md -UseBasicParsingPuts the files in .cursor/skills/mttr-page-system/.
Any other agent
An agent that does not load skills can still follow the file. Save the folder in the repository and point its standing instructions at it, with a line in AGENTS.md, which many agents read. The agent reads AGENTS.md when it starts, and follows the file when the task matches.
mkdir -p docs/mttr-page-system/references docs/mttr-page-system/scripts
curl -fsSL https://mttr.si/skills/page-system/SKILL.md -o docs/mttr-page-system/SKILL.md
curl -fsSL https://mttr.si/skills/page-system/references/page-kinds.md -o docs/mttr-page-system/references/page-kinds.md
curl -fsSL https://mttr.si/skills/page-system/references/structured-data.md -o docs/mttr-page-system/references/structured-data.md
curl -fsSL https://mttr.si/skills/page-system/references/components.md -o docs/mttr-page-system/references/components.md
curl -fsSL https://mttr.si/skills/page-system/references/outline-and-accessibility.md -o docs/mttr-page-system/references/outline-and-accessibility.md
curl -fsSL https://mttr.si/skills/page-system/references/links-and-hubs.md -o docs/mttr-page-system/references/links-and-hubs.md
curl -fsSL https://mttr.si/skills/page-system/references/images-and-speed.md -o docs/mttr-page-system/references/images-and-speed.md
curl -fsSL https://mttr.si/skills/page-system/references/spacing.md -o docs/mttr-page-system/references/spacing.md
curl -fsSL https://mttr.si/skills/page-system/references/spacing-traits.md -o docs/mttr-page-system/references/spacing-traits.md
curl -fsSL https://mttr.si/skills/page-system/scripts/measure.mjs -o docs/mttr-page-system/scripts/measure.mjs
curl -fsSL https://mttr.si/skills/page-system/references/migration.md -o docs/mttr-page-system/references/migration.md
curl -fsSL https://mttr.si/skills/page-system/references/troubleshooting.md -o docs/mttr-page-system/references/troubleshooting.md
echo "For page templates and shared components, follow docs/mttr-page-system/SKILL.md." >> AGENTS.mdNew-Item -ItemType Directory -Force docs\mttr-page-system\references | Out-Null
New-Item -ItemType Directory -Force docs\mttr-page-system\scripts | Out-Null
Invoke-WebRequest https://mttr.si/skills/page-system/SKILL.md -OutFile docs\mttr-page-system\SKILL.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/page-kinds.md -OutFile docs\mttr-page-system\references\page-kinds.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/structured-data.md -OutFile docs\mttr-page-system\references\structured-data.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/components.md -OutFile docs\mttr-page-system\references\components.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/outline-and-accessibility.md -OutFile docs\mttr-page-system\references\outline-and-accessibility.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/links-and-hubs.md -OutFile docs\mttr-page-system\references\links-and-hubs.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/images-and-speed.md -OutFile docs\mttr-page-system\references\images-and-speed.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/spacing.md -OutFile docs\mttr-page-system\references\spacing.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/spacing-traits.md -OutFile docs\mttr-page-system\references\spacing-traits.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/scripts/measure.mjs -OutFile docs\mttr-page-system\scripts\measure.mjs -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/migration.md -OutFile docs\mttr-page-system\references\migration.md -UseBasicParsing
Invoke-WebRequest https://mttr.si/skills/page-system/references/troubleshooting.md -OutFile docs\mttr-page-system\references\troubleshooting.md -UseBasicParsing
Add-Content AGENTS.md "For page templates and shared components, follow docs/mttr-page-system/SKILL.md."Puts the files in docs/mttr-page-system/.
What is inside
Every file in the folder, as it is served at https://mttr.si/skills/page-system/, so an agent can fetch any one again to update it.
mttr-page-system/
- SKILL.md
The eight steps from naming each kind of page to setting its spacing and proving each pattern with mttr, and the table of patterns, rules and free checks.
references/
- page-kinds.md
A template for the home, service, product, article, hub and plain pages: the outline, the structured data, the links in and out, the rules each answers, how mttr files a page, and a service template before and after.
- structured-data.md
JSON-LD for each kind of page, how to escape it, FAQ only where it is real, what never to mark up, a full article graph, Google’s required fields, building a block from data and what breaks it, and Google’s and schema.org’s pages for each type.
- components.md
The frame, breadcrumb, question and answer, table, image, byline, sources, contact block, footer and links in the text, each as the HTML it should send.
- outline-and-accessibility.md
How mttr reads each heading rule, an outline before and after, landmarks and the skip link, language, focus and accordions, and how to check each.
- links-and-hubs.md
The tree from home to hubs to pages, hub and spoke worked, links a crawler can follow, paged lists, town pages that read as doorways, and the sitemap.
- images-and-speed.md
Alt text decided case by case, the image element before and after, the order of speed work, and the commands that check compression and first byte.
- spacing.md
Finding the scale a site already uses, writing it as tokens for CSS or Tailwind, moving every padding, margin and gap onto it a component at a time, and a measure to run in the browser before and after.
- spacing-traits.md
The spacing rules, one to a section with an id that stays the same: twelve measured by code and four judged from screenshots, each with a bad and a good example.
- migration.md
Moving a live site onto the system a template at a time: the order of releases, what not to change, moving an address, and notes for Next.js, Shopify, WordPress and single page apps.
- troubleshooting.md
A rule that still fails after the fix, by symptom, cause and fix, and the traps that look like success.
- page-kinds.md
scripts/
- measure.mjs
Measures a page against the twelve measured spacing traits at 1440 and 375 wide, in the Chrome already on the machine, with nothing to install. Exits 1 when a trait fails.
- measure.mjs
- CHANGELOG.md
Every release and what it changed, newest first. Not installed: the changes, for you.
Its references
SKILL.md sends your agent to these files when a step needs them, so the main file stays short. Open the sections to see what each holds, or copy a request that points your agent at one.
A template for the home, service, product, article, hub and plain pages: the outline, the structured data, the links in and out, the rules each answers, how mttr files a page, and a service template before and after.
Its eight sections
- L7How mttr files a pagemttr decides a page's kind from its address and its structured data, in this order, and checks it against that kind's rules:
- L20HomeWhat the business is, what it does and where, in the first screen, then a way into each part of the site.
- L47Service or location servedOne offer per page: what it is, who it is for, what it costs or how a price is reached, the area, and the next step.
- A service template, before and after
- L124ProductOne product per page, with its price, stock and variants stated where a shopper sees them.
- L144ArticleA guide that answers one question well: the answer first, then the reasons, the figures and the sources.
- L172HubThe list of every page of one kind, so each is a click from home and a click from its neighbours.
- L190Plain page: about, contact, pricing, policiesAbout: who runs the business, since when, licences and memberships with their numbers, and where it works.
- L198Every kindOne
h1, in<main>, from the page's own data.
JSON-LD for each kind of page, how to escape it, FAQ only where it is real, what never to mark up, a full article graph, Google’s required fields, building a block from data and what breaks it, and Google’s and schema.org’s pages for each type.
Its 12 sections
- L5How to write itOne graph per page under
@graph, each thing with an@idso others can point at it. - L13Home: the business and the siteUse
Organizationfor a business with no place customers visit and no area it serves. - L51ServiceAn
offerswith a price only where the page states that price. - L83ArticleOne graph for the page: the page itself, its trail and the article, each pointing at the others by
@id. - L134Product
Productwith anOfferfor each variant, or aProductGroupwithhasVariant. - L138FAQ, only where it is realEvery question is on the page word for word, and every answer is the one the page shows.
- L153Hub and plain pageUse
WebPage, orAboutPageandContactPagewhere they fit, for a plain page, with aBreadcrumbListbelow the home page. - L167Building it from data, workedBefore: JSON typed into a template, so one stray quote breaks every page, and the values drift from the page.
- L194What breaks it
- L205NeverA rating or review count unless the reviews it counts are on the page.
- L211Check it
https://mttr.si/schema-checker?url=<page>reads every block on one page, or a block pasted in. - L230SourcesIntroduction to structured data markup in Google Search: why JSON-LD, and how Google reads it.
The frame, breadcrumb, question and answer, table, image, byline, sources, contact block, footer and links in the text, each as the HTML it should send.
Its 12 sections
- L5The frameEvery page's shared layout.
- L40BreadcrumbThe same trail as the page's
BreadcrumbList, from the same data. - L55Question and answerThe heading is the question a reader asks.
- L68TableA real
<table>with a caption and header cells, not a grid of<div>s. - L81ImageAlt text says what the picture shows, not the keywords of the page.
- L95Byline and dateThe date shown is the
dateModifiedin the Article data, and changes only when the content does. - L104SourcesLinks a reader can see and follow, to the official or primary source of each fact.
- L118Contact blockA
tel:link where the business takes calls, and a form or a link to one on every page. - L131FooterThe footer links every hub, so each sits one click from every page.
- L147Related links in the textA link in a sentence says what two pages have to do with each other.
- L157Contrast and speedText at least 4.5 to 1 against its background, and large text at least 3 to 1, in every theme.
- L163SourcesInfluencing your title links in search results: what makes a good title in the frame.
How mttr reads each heading rule, an outline before and after, landmarks and the skip link, language, focus and accordions, and how to check each.
Its seven sections
- L5How mttr reads the outlineKnowing what code counts saves guessing.
- L16The outline, workedBefore: sizes chosen by look, a logo as the
h1, the answer after a picture. - L54LandmarksOne
<main>, top-level, not inside another landmark. - L72Language, names and focus
<html lang="en">, or the page's real language, set per page on a site in several. - L80Accordions, tabs and hidden textAn accordion built on
<details>and<summary>keeps its text in the HTML, and mttr reads asummarythat ends in a question mark as a question… - L86Check itThe
curlcount reads the HTML the server sends, which is what mttr and most AI crawlers read. - L97SourcesHeadings: W3C WAI's Page Structure Tutorial on heading ranks, skipping levels and fixed sections.
The tree from home to hubs to pages, hub and spoke worked, links a crawler can follow, paged lists, town pages that read as doorways, and the sitemap.
Its nine sections
- L5How mttr reads links
within-three-clicksfollows links from the home page and fails a page more than three clicks away. - L14The treeHome to hub is one click, hub to page is two.
- L32Hub and spoke, workedThe hub lists every page of its kind from the same data that makes the pages.
- L60Links a crawler can followAn
<a href="/real/path">. - L67Paged hubsEach page of the list has its own address and a canonical to itself, never to page one.
- L84Town and location pagesA page for each town that swaps only the town's name is what Google's spam policies call doorway abuse, and mttr's
pages-are-distinctcatches it… - L92The sitemapMade from the same data as the pages, so it lists every page that should rank and nothing that should not: no
noindexpages, no redirects, no… - L111Check it
- L121SourcesLink best practices for Google: what makes a link crawlable, anchor text, and a link to every page that matters.
Alt text decided case by case, the image element before and after, the order of speed work, and the commands that check compression and first byte.
Its six sections
- L5How mttr reads images and speed
has-imagepasses an article or service page with animg,picture,video, ansvginside afigure, or ansvgwithrole="img"in its… - L15Alt text, decidedWork down the list for each image and stop at the first that fits.
- L32The image element, workedBefore: a background picture and an image the page jumps around.
- L63Speed that decides what a crawler readsOrder of work, by what it gives a reader and a crawler:
- L75Check it
- L85SourcesGoogle image SEO best practices: alt text, the
imgelement over CSS images,srcsetwith asrcfallback, and file names.
Finding the scale a site already uses, writing it as tokens for CSS or Tailwind, moving every padding, margin and gap onto it a component at a time, and a measure to run in the browser before and after.
Its six sections
- L7Find the site's own scaleA site almost always has a scale already, written down or not.
- L26Write it down as tokensPut the scale in one place, in the site's own way:
- L45Move the values onto itWork a shared component at a time, the frame first, so one change fixes every page that uses it.
- L53Measure the page
scripts/measure.mjsin this skill measures a page against the twelve measured traits, at 1440 and 375 wide, in the Chrome already on the machine. - L88Read the judged traitsTake a full page screenshot at 1440 and at 375 of a page of each template.
- L92Report back
The spacing rules, one to a section with an id that stays the same: twelve measured by code and four judged from screenshots, each with a bad and a good example.
Its 16 sections
- L9one-scaleMeasured.
- L17steps-you-can-seeMeasured.
- L25one-containerMeasured.
- L33section-rhythmMeasured.
- L41near-belongs-togetherMeasured.
- L49heading-gapMeasured.
- L57one-gap-per-listMeasured.
- L65card-paddingMeasured.
- L73reading-widthMeasured.
- L81nothing-short-wrapsMeasured.
- L89phone-gutterMeasured.
- L97room-to-tapMeasured.
- L105space-not-bordersJudged.
- L113no-empty-columnsJudged.
- L121one-header-shapeJudged.
- L129density-fits-the-jobJudged.
Moving a live site onto the system a template at a time: the order of releases, what not to change, moving an address, and notes for Next.js, Shopify, WordPress and single page apps.
Its six sections
- L5The order**Baseline.**
mttr_site({ site }),mttr_brief({ site })andmttr_pages({ site }), kept as they came back. - L16What not to change while migratingAn address that already ranks, unless it is wrong in a way that costs more than the move.
- L23When an address has to moveGoogle's guide to moving a site lays out the same steps for a few pages as for a whole domain.
- L35Where the parts live, by platformOnly what is genuinely different on each.
- Next.js (App Router)
- Shopify (Liquid themes)
- WordPress
- A single page app
- L63Proving each releaseAfter each release goes live:
- L78SourcesHow to move a site: mapping old addresses, permanent server-side redirects in one hop, updating links and sitemaps, and keeping redirects a year or…
A rule that still fails after the fix, by symptom, cause and fix, and the traps that look like success.
Its three sections
- L10By rule
- L39Traps that look like successThe browser's inspector shows the fix, but the server's HTML does not: the inspector shows the page after scripts ran.
- L46SourcesGeneral structured data guidelines: markup only for what the page shows, on the page it describes.
Version and changes
Version 1.3.1, October 23, 2026. The version is in SKILL.md under metadata, where the Agent Skills format keeps what it does not define, and follows semantic versioning: a new major version changes what the skill asks of you or your agent.
1.3.1October 23, 2026Current
- The spacing measure says its sample paths are Claude Code's, and to use the folder the client keeps the skill in.
- The example of a service page filed as a plain page uses a sample town.
1.3.0October 20, 2026
scripts/measure.mjsmeasures a page against the twelve measured spacing traits at 1440 and 375 wide, in the Chrome already on the machine, with nothing to install. It finds the page's own scale when none is given, prints each trait with where it failed, and exits 1 when one fails.- Step 7's check runs the script; the console snippet stays for where Node or Chrome cannot run.
- A step on the scale is now a quarter larger than the one before from 16px up, not a third, so 24, 32 and 48 sit on one scale as they do on most sites.
- The space between sections counts the padding each keeps, since many sites space sections with padding and leave no gap between them.
1.2.0October 20, 2026
- New step 7, set the spacing: find the site's own scale, name the roles, write the scale as tokens, and move every padding, margin and gap onto it a component at a time. Proving it with mttr is now step 8.
- New reference on spacing and rhythm: finding the scale from the site's tokens or the values its stylesheets use most, tokens for CSS and Tailwind, the order of work, a measure to run in the browser before and after, and how to read the judged traits.
- New reference of spacing traits, one rule to a section with an id that stays the same: twelve measured by code and four judged from screenshots, each with a bad and a good example.
- The skill now covers spacing as part of a page's structure. Colour, type faces and the brand still stay as they are.
1.1.0October 18, 2026
- Each step ends in a check: what to run or open, and what a pass looks like.
- The proof table names 38 rules, up from 32:
one-address,loads,depth,pages-are-distinct, and the judge'sanswers-the-questionandclaims-supported, which it says a person may need to check. - New reference on the outline and accessibility: how mttr reads each heading rule, an outline before and after, landmarks, the skip link, language, focus, and accordions.
- New reference on links, hubs and the sitemap: the tree, hub and spoke worked, links a crawler can follow, paged lists, town pages that read as doorways, and the sitemap.
- New reference on images and speed: alt text decided case by case, the image element before and after, the order of speed work, and
curlchecks for compression and first byte. - New reference on moving a live site onto the system a template at a time, with what not to change, moving an address, and notes for Next.js, Shopify, WordPress and single page apps.
- New reference for a rule that still fails after the fix, by symptom, cause and fix, and the traps that look like success.
- Page kinds says how mttr files a page and the words each kind needs, with a service template before and after and an author page.
- Structured data has a full article graph, Google's required and recommended fields for each type, opening hours, building a block from data, what breaks it, and a command that parses every block a page sends.
- Liquid's
jsonfilter is no longer said to stop a value closing the script tag: Shopify says only that it escapes quotes.
1.0.1October 16, 2026
- Each source is listed by its page's own title, with what the skill takes from it, including the Rich Results Test, WCAG 2.2 and Web Vitals.
- Google no longer shows FAQ results in Search and removed their documentation in June 2026: the FAQ notes say so, and cite Google's update in place of the page that is gone.
1.0.0October 16, 2026
- First release: seven steps from naming each kind of page to proving each pattern with mttr.
- Templates for the home, service, product, article, hub and plain pages, with the structured data for each.
- Component patterns: the frame, breadcrumb, question and answer, table, image, byline, sources, contact block, footer and links in the text.
The skill in full
This is the file the commands above fetch, as it is served at /skills/page-system/SKILL.md.
---
name: mttr-page-system
description: Builds a site's page templates and shared components so search engines and AI assistants read every page well, and proves each pattern with mttr. Covers one h1 and a real outline, landmarks, an answer-first opening, structured data for each kind of page, share tags, canonical and indexing, internal links and hubs, images, speed and contrast, spacing on one scale with an even rhythm, and moving an existing site onto it a template at a time. Use when building or reworking a site's layout, page templates, components or design system, adding a new kind of page, or when mttr findings point at a shared template. About the structure of pages and their spacing, not their colour, type or brand.
metadata:
author: subinternal
version: "1.3.1"
---
<!-- subinternal:header -->
```
╭─────────────────────────────────────────────────────────────────╮
│ ▄ │
│ ▄ █ mttr │
│ ▄ █ █ page system │
│ ▄ █ █ █ │
│ │
│ skill 1.3.1 · by subinternal · mttr.si/skills/page-system │
╰─────────────────────────────────────────────────────────────────╯
```
Print this header once, exactly as it is, in a code block, as the first thing you show when this skill starts. Then go on.
<!-- /subinternal:header -->
# Page system
Build each kind of page once, as a template, so every page made from it is easy for crawlers and assistants to read: what it is, what it answers, who stands behind it, where it sits in the site, and what to do next. You work in the site's own repository. mttr reads the live pages and says which patterns hold.
This is about structure: the HTML a server sends, its headings, its data and its links, and the spacing that tells a reader what belongs together. It is not about colour, type faces or the brand. Keep the site's own look; change what is underneath it.
Work the eight steps in order. Do not change a file before step 2. Each step links the reference that holds its depth:
- [references/page-kinds.md](references/page-kinds.md): a template for each kind of page, how mttr files a page, and a service template before and after.
- [references/components.md](references/components.md): each shared component as the HTML it should send.
- [references/outline-and-accessibility.md](references/outline-and-accessibility.md): headings, landmarks, language, focus, and how mttr reads the outline.
- [references/structured-data.md](references/structured-data.md): JSON-LD for each kind, built from data, and what breaks it.
- [references/links-and-hubs.md](references/links-and-hubs.md): the tree, hubs, paged lists, town pages and the sitemap.
- [references/images-and-speed.md](references/images-and-speed.md): alt text, the image element, and the speed that decides what a crawler reads.
- [references/spacing.md](references/spacing.md): finding the site's own scale, writing it as tokens, moving values onto it, and measuring a page.
- [references/spacing-traits.md](references/spacing-traits.md): the spacing rules, one to a section, each measured or judged, with a bad and a good example.
- [references/migration.md](references/migration.md): moving a live site onto the system a template at a time, with platform notes.
- [references/troubleshooting.md](references/troubleshooting.md): a rule that still fails after the fix, by symptom.
## Before you start
1. Ask the person for the site's live domain, or the local address of a site not yet live, and whether you may deploy or only open a pull request.
2. Find how pages are made: the framework, where the shared layout lives, where each template lives, and whether pages come from files, a CMS or a database. Check whether a plugin or app already writes meta tags or JSON-LD. Say what you found.
3. Take a baseline. With mttr connected over MCP (the `mttr` skill sets it up), call `mttr_site({ site })`, `mttr_brief({ site })` and `mttr_pages({ site })`. With no key, open `https://mttr.si/report/<domain>`, or check single pages with the free tools at `https://mttr.si/tools`. Keep the result: step 7 compares against it.
4. On a live site with pages that already rank, read [references/migration.md](references/migration.md) first: it sets the order of releases, and what not to change while you work.
## 1. Name each kind of page
List every template and say which kind of page each one makes.
| Kind | What it is | How mttr knows it |
|---|---|---|
| Home | The site's front page | The address `/` |
| Service or product | One offer: a service, a product, a location served | An address under `/services/`, `/service-area/`, `/locations/` or `/products/`, or `Service` or `Product` in its structured data |
| Article | A guide, a post, a how-to | An address under `/guides/`, `/blog/`, `/articles/`, `/news/`, `/resources/` or `/learn/`, or an `Article` type in its structured data |
| Hub | A list of pages of one kind, such as `/services` | Read as a plain page |
| Plain page | About, contact, pricing, policies, authors | Anything else |
mttr gives each kind its own rules, so a page it files under the wrong kind is checked against too few. Where the address cannot change, the structured data type tells mttr the kind. Never move a live address only to change its kind without a redirect and the person's leave.
Check: `mttr_pages({ site, kind: "page" })` lists what mttr filed as plain pages. A service or a guide in that list is filed wrong. The full order mttr uses is in [references/page-kinds.md](references/page-kinds.md).
## 2. Build the frame once
Put everything every page needs in the shared layout, so no template can forget it.
- `<html lang>`, a `<title>` and a meta description made per page from that page's own data.
- A canonical link to the page's own final address, and `noindex` only on pages meant to stay out of search.
- Share tags: `og:title`, `og:description`, `og:image` with `og:image:alt`, and `twitter:card` as `summary_large_image`. A share image 1200 by 630 pixels fits every site that shows one.
- Landmarks: one `<header>`, a `<nav>` for the menu, one `<main>` around the page's own content, and a `<footer>`, with a skip link to `<main>`. mttr counts the text inside `<main>` as the page and leaves menus, forms and scripts out.
- The logo is a link, not an `h1`. mttr counts every `h1` in the HTML, header included.
- The page's text in the HTML the server sends. Text added by script after load is not read by most AI crawlers.
- A footer with the way to get in touch, a tap-to-call link where the business takes calls, and a link to `/llms.txt`.
- One address for the site: http, https, www and the bare domain redirect to one of them.
The frame, as code, is the first pattern in [references/components.md](references/components.md); the landmarks and why each is there are in [references/outline-and-accessibility.md](references/outline-and-accessibility.md).
Check: `curl -s <page> | grep -c 'rel="canonical"'` is `1` on a page of every template, and `https://mttr.si/og-image-checker?url=<page>` shows the share image and its alt.
## 3. Give every page one outline
Each page has exactly one `h1` that says what the page is about, then `h2` and `h3` in order, never skipping a level for size.
- On articles and service pages, phrase at least one heading as the question a person would ask, and answer it in the paragraph right under it, before any detail. mttr counts the words of that first paragraph: 25 to 90.
- Put the answer in words, not in an image or a script.
- Use a list or a table where the content is a set of items or figures, and a table where it compares options.
- Headings come from the page's own data, never typed once into a template so every page shares them.
The outline before and after, accordions, and how mttr reads each heading rule are in [references/outline-and-accessibility.md](references/outline-and-accessibility.md).
Check: `https://mttr.si/h1-checker?url=<page>` shows one `h1` and no level skipped; `https://mttr.si/agent-view?url=<page>` shows the text an agent gets.
## 4. Write the structured data for its kind
Each template writes one JSON-LD graph that says what the page is, from the same data the page shows.
| Kind | Types |
|---|---|
| Home | `Organization`, or `LocalBusiness` or one of its subtypes for a business with a place or an area served, and `WebSite` |
| Service | `Service` with its `provider`, or `Product` for a thing sold; `BreadcrumbList` |
| Product | `Product` or `ProductGroup` with an `Offer`; `BreadcrumbList`. The `mttr-shop-ready` skill covers it field by field |
| Article | `Article` or `BlogPosting` with `headline`, `datePublished`, `dateModified`, `author` and `publisher`; `BreadcrumbList` |
| Hub and plain page | `WebPage` or `CollectionPage`, and `BreadcrumbList` below the home page |
`FAQPage` only where the questions and answers are on the page, word for word. A rating only where the reviews it counts are on the page. Never a fact the page does not state. Build the graph as an object from the page's fields and serialise it once; never type JSON into a template as text. Examples for each type, the escaping for each framework, and the failures that break a block are in [references/structured-data.md](references/structured-data.md). `mttr_schema_create({ type, fields })` gives a block from fields you supply and leaves the rest empty.
Check: `https://mttr.si/schema-checker?url=<page>` on a page of each template finds the types the table names, and every block parses.
## 5. Link the pages into hubs
Make the site a tree a crawler can walk: home, then hubs, then the pages under them.
- Every page that should rank sits within three clicks of the home page, and is linked from the text of a related page, not only from the menu.
- A hub for each kind of page with more than a few, linking to each one with its title and one line.
- A visible breadcrumb on every page below the home page, matching its `BreadcrumbList`.
- Links are `<a href>` to the final address, never to one that redirects, and never a button a crawler would have to click.
- Pages of one kind say different things. A page per town that swaps only the name is a doorway page.
- `/sitemap.xml` lists every page that should rank, made from the same data as the pages, and `robots.txt` names it.
Hub and spoke, paged lists, town pages and the sitemap, worked, are in [references/links-and-hubs.md](references/links-and-hubs.md).
Check: `mttr_structure({ site })` shows every section within three clicks; `mttr_pages({ site, failing: "linked-in-context" })` is empty.
## 6. Build the parts that carry weight
Each of these is a component with one job. The patterns are in [references/components.md](references/components.md).
- Images: an `<img>` with alt text that says what it shows, `width` and `height` set so the page does not move, and `loading="lazy"` on all but the first. A background image in CSS has no alt text and is not read as content. Which alt for which image is in [references/images-and-speed.md](references/images-and-speed.md).
- Dates and names: an article shows when it was last updated in a `<time datetime>` and names who wrote it, both in its structured data too, with a page about each author.
- Sources: an article links the sources for its facts where a reader can see them.
- Claims: a sales claim is a fact that can be checked, or it goes.
- Contact: every page has a form or a clear link to get in touch.
- Contrast: body text at least 4.5 to 1 against its background, in every theme the site has.
- Speed: HTML compressed with gzip or Brotli, pages cached, no script or font that blocks the first paint without need. Google's Core Web Vitals are the shared yardstick for how a page loads; the order of work and how to measure it are in [references/images-and-speed.md](references/images-and-speed.md).
Check: `mttr_pages({ site, failing: "image-alt" })` and the same for `dated` and `sources-shown` come back empty.
## 7. Set the spacing
Put every page on one spacing scale with an even rhythm, so a reader sees what belongs together and where each part ends.
- Find the scale the site already uses, from its tokens or from the values its stylesheets use most. Only a site with none takes 4, 8, 12, 16, 24, 32, 48, 64 and 96 pixels. Show the person the scale before changing anything.
- Name the roles once: the gap between sections, a card's padding, the gap under a heading, the gaps a list may use, each with one smaller value for phones.
- Write the scale as tokens in one place, and move every padding, margin and gap onto it, a shared component at a time.
- Space between siblings is the parent's `gap`; space between sections is set once on their container.
- Work through the traits in [references/spacing-traits.md](references/spacing-traits.md). Twelve are measured by code, four judged from screenshots, and a judged trait that is unsure goes to the person.
Finding the scale, the tokens, and the measure to run before and after are in [references/spacing.md](references/spacing.md).
Check: `node scripts/measure.mjs <page>` from this skill's folder, on a page of each template, passes the twelve measured traits; [references/spacing.md](references/spacing.md) says how to read what it prints.
## 8. Prove it with mttr
Ship as the person allows, then check each pattern on a live page of each template.
| Pattern | mttr rules | Check one page with no key |
|---|---|---|
| The frame | `title`, `description`, `canonical`, `indexable`, `share-image`, `content-in-html`, `one-address` | `https://mttr.si/og-image-checker?url=<page>` |
| One outline | `one-h1`, `question-headings`, `answer-first`, `answers-the-question`, `liftable-blocks`, `has-table` | `https://mttr.si/h1-checker?url=<page>` |
| Structured data | `structured-data`, `schema-fits`, `breadcrumb`, `faq-matches-page`, `ratings-are-real` | `https://mttr.si/schema-checker?url=<page>` |
| Links and hubs | `within-three-clicks`, `linked-in-context`, `no-orphans`, `direct-links`, `loads`, `sitemap` | `https://mttr.si/redirect-checker?url=<page>` |
| Distinct pages | `depth`, `pages-are-distinct` | `https://mttr.si/agent-view?url=<page>` |
| Parts that carry weight | `has-image`, `image-alt`, `dated`, `named-publisher`, `sources-shown`, `plain-claims`, `claims-supported`, `phone-link`, `next-step` | the site's report |
| Speed | `compressed`, `quick-to-answer` | `https://mttr.si/website-speed-test?url=<page>` |
| llms.txt | `llms-txt` | `https://mttr.si/ai-crawler-checker?url=<domain>` |
`answers-the-question` and `claims-supported` are read by mttr's model judge, which gives an opinion a person may need to check; the rest are read by code. `mttr_rules()`, or `https://mttr.si/rulebook` with no key, gives each rule's current wording and fix. Read it there rather than from this file.
Over MCP, once the change is live: `mttr_rescan({ site, reason: "page templates" })`, `mttr_job({ id })` until done, then `mttr_changes({ site })` against the baseline. `mttr_pages({ site, failing: "<rule>" })` lists any page a rule still fails, which usually points at a template step 1 missed. A rule that still fails after the fix is worked through by symptom in [references/troubleshooting.md](references/troubleshooting.md).
## Report back
```
Site: <domain>. Templates: <n>, each named with its kind.
| Template | Kind | Patterns added | Rules before | Rules after |
|---|---|---|---|---|
| <path> | <kind> | <frame, outline, data, links, parts> | <n> failing | <n> failing |
Left as it was, and why: <pattern: reason, such as "dated: the CMS keeps no edit date yet">.
Spacing traits: <n> measured pass of 12, <n> judged pass of 4, <n> left to the person.
This changed the structure of the pages and their spacing, not their colour, type or brand. A score says the pages are well formed. It does not say any assistant cites the site.
```
## What this never does
- It never changes the site's colour, type faces or brand, its copy's meaning, or its prices, policies or offers. Spacing moves onto the site's own scale; nothing is restyled.
- It never invents a date, an author, a source, a review, a rating, an address or a credential to fill a field.
- It never adds `FAQPage`, a rating or any other type for a feature the page does not show.
- It never opens a draft or closed site to crawlers, or removes `noindex`, without the person's leave.
- It never moves a live address without a permanent redirect, and the person's leave.
Sources
48 pages
Each is in a ## Sources list in the file that cites it, by the page’s own title.
Google Search Central
- 1Rich Results Test, Google Search Console. Google's own read of one page.
- 2Introduction to structured data markup in Google Search, Google Search Central. Why JSON-LD, and how Google reads it.
- 3General structured data guidelines, Google Search Central. Markup only for what the page shows, on the page it describes.
- 4Organization (Organization) structured data, Google Search Central. The fields for the home page's Organization, the logo's size, and the home or about page as its place.
- 5Local business (LocalBusiness) structured data, Google Search Central. `name` and `address` as required, the phone with its country code, and the format of opening hours.
- 6Article (Article, NewsArticle, BlogPosting) structured data, Google Search Central. The recommended properties, the author rules, dates with a time zone, and the image sizes.
- 7Breadcrumb (BreadcrumbList) structured data, Google Search Central. At least two items, no `item` needed on the last, and a trail that follows a person's path.
- 8Latest documentation updates, Google Search Central. Google's note that FAQ results are no longer shown in Search.
- 9Influencing your title links in search results, Google Search Central. What makes a good title in the frame.
- 10Control your snippets in search results, Google Search Central. The meta description and how Google uses it.
- 11How to specify a canonical URL with rel="canonical" and other methods, Google Search Central. One address for each page.
- 12Block Search indexing with noindex, Google Search Central. `noindex` in a meta tag or the `X-Robots-Tag` header.
- 13Link best practices for Google, Google Search Central. What makes a link crawlable, anchor text, and a link to every page that matters.
- 14Google image SEO best practices, Google Search Central. Alt text, the `img` element over CSS images, `srcset` with a `src` fallback, and file names.
- 15URL structure best practices for Google Search, Google Search Central. Words with hyphens, one case, no fragments for content, and root-relative links.
- 16Pagination, incremental page loading, and their impact on Google Search, Google Search Central. A canonical for each page of a list, links to the next and the first, and load more given addresses.
- 17Build and submit a sitemap, Google Search Central. Full canonical addresses, accurate lastmod, the size limits, and the robots.txt line.
- 18Spam policies for Google web search, Google Search Central. Doorway abuse and scaled content abuse, the risk in town pages that swap only a name.
- 19Understand the JavaScript SEO basics, Google Search Central. Rendering, why server rendering is still advised, and that not every bot runs script.
- 20How to move a site, Google Search Central. Mapping old addresses, permanent server-side redirects in one hop, updating links and sitemaps, and keeping redirects a year or more.
- 21Redirects and Google Search, Google Search Central. Which redirects Google reads as permanent and which as temporary, and why server-side is best.
schema.org
- 22LocalBusiness, schema.org. The type and its properties.
- 23Service, schema.org. The type for a service page.
- 24Article, schema.org. The type for an article page.
- 25BreadcrumbList, schema.org. The type for the trail.
- 26FAQPage, schema.org. The type for questions and answers the page shows.
- 27OpeningHoursSpecification, schema.org. The type for opening hours, with `dayOfWeek`, `opens` and `closes`.
Platforms
- 28How to implement JSON-LD in your Next.js application, Vercel, on GitHub. Next.js's own guide to JSON-LD in a server component, with the `<` escape.
- 29generateMetadata, Vercel, on GitHub. The metadata object and function, the canonical and share fields, and that they run only in server components.
- 30sitemap.xml, Vercel, on GitHub. `app/sitemap.ts`, a sitemap made by a function from the site's data.
- 31robots.txt, Vercel, on GitHub. `app/robots.ts`, with the line that names the sitemap.
- 32Layouts, Shopify developer docs. `theme.liquid` as the layout every template is drawn through.
- 33Liquid filters: json, Shopify developer docs. What Shopify's `json` filter escapes, and what it does not say it escapes.
Standards and protocols
- 34Web Content Accessibility Guidelines (WCAG) 2.2, W3C. Success criterion 1.4.3, the contrast every theme meets.
- 35Web Vitals, Google, on web.dev. The shared yardstick for how fast a page answers.
- 36The Open Graph protocol, The Open Graph protocol. The share tags in the frame.
- 37Headings, W3C. W3C WAI's Page Structure Tutorial on heading ranks, skipping levels and fixed sections.
- 38Landmark Regions, W3C. One top-level main, labels for repeated landmarks, and labels that do not repeat the role.
- 39Web Content Accessibility Guidelines (WCAG) 2.2, W3C. Success criteria 1.3.1, 2.4.1, 2.4.6, 2.4.11 and 3.1.1, the structure, skip link, headings, focus and language this file asks for.
- 40h1 to h6, the HTML section heading elements, MDN Web Docs. Not resizing text with headings, not skipping levels, and one `h1` as the better practice.
- 41Optimize Largest Contentful Paint, Google, on web.dev. Never lazy load the main image, high fetch priority, the image findable in the HTML, and time to first byte.
- 42Browser-level image lazy loading for the web, Google, on web.dev. Lazy only below the first screen, and `width` and `height` on every image.
- 43An alt Decision Tree, W3C. W3C WAI's order for choosing alt text, which the table above follows.
- 44The Image Embed element, MDN Web Docs. `alt=""`, `srcset` and `sizes`, `width` and `height`, `fetchpriority` and `decoding`.
Agent skills format and clients
- 45Extend Claude with skills, Anthropic, Claude Code docs. Where Claude Code loads skills from, and how one is called.
- 46Build skills, OpenAI, ChatGPT Learn. Where Codex loads skills from, and how one is called.
- 47Agent Skills, Cursor docs. Where Cursor loads skills from, and how one is called.
- 48Specification, Agent Skills. The format every skill here keeps: the folder, the frontmatter and its limits.