---
"@type": Article
"@id": "https://helloloam.dev/principles/seo-friendly"
"@source": "https://helloloam.dev/data/article/seo-friendly.json"
"@stamp": "2026-10-22T21:53:55+00:00"
about:
  "@type": DefinedTerm
  "@id": "https://helloloam.dev/data/definedterm/seo-friendly.json"
  name: SEO friendly from the start
  identifier: seo-friendly
  inDefinedTermSet:
    "@type": DefinedTermSet
    "@id": "https://helloloam.dev/data/definedtermset/gives-any-site.json"
    name: Gives any site
    identifier: gives-any-site
author: {"@id":"https://helloloam.dev/#organization"}
datePublished: "2026-10-03"
description: The page and its structured data come from the same file, so they cannot disagree. Sitemap, canonicals and language links write themselves.
headline: SEO friendly from the start
identifier: seo-friendly
inLanguage: en
publisher: {"@id":"https://helloloam.dev/#organization"}
url: "https://helloloam.dev/principles/seo-friendly"
---

# SEO friendly from the start

## Found by construction

“Does Google find my site?” has the same answer as “does ChatGPT find my site?”: yes, by construction. A product page says it is a `Product` — name, price, image, description — in the fields a search engine expects. One file renders the page and its [structured data](/principles/schema-as-data), so the two cannot disagree.

## Structured data on every page

Each page carries its JSON-LD: the organisation, the website, the page and the entity it is about, with references resolved. Nobody writes it separately — it is the same record the page is rendered from, made fit for the outside.

## Addresses from the data

A page exists because an entity claims a slug. Its canonical address, its language links (hreflang) and its sitemap line all derive from that one fact. On a site with more languages, every entity carries its address per language; a page without a translation simply does not exist in that language — no empty page, no invented one. Move a page by changing its slug, and a redirect catches the old address.

## What a crawler finds

- **A sitemap that cannot drift.** `/sitemap.xml` is computed from the same register that makes pages exist — per language, alternates included. A sitemap entry for a page that is gone is impossible.
- **The first file a crawler reads.** `robots.txt` points at the sitemap of every language, the content signals and the machine views.
- **A feed when you want one.** Name the types or lists that feed it, and `/feed.xml` is announced and kept current.

Publish an entity and every one of these follows on the next request. Nothing to export, nothing to regenerate.

## What you control

The views write themselves; the words are yours. A title and a description in plain language, a sentence each. An image with a caption. An address that says what the page is. The order of the curated sections in `llms.txt`, which decides what an assistant reads first. Ask your agent how a page looks to a machine, and it reads the machine view back to you.

## What it costs

The engine invents nothing. Titles and descriptions are yours to write — in plain language, a sentence each — and a page without a description stays out of `llms.txt` until it has one; the check before publishing tells you so. There are no SEO knobs to turn, because there is nothing to correct: what ranks is what you wrote.
