---
title: Metadata
description: The head tags every page renders — title, description, canonical, Open Graph and X card tags — and how to override them per page from frontmatter.
---

Every page renders the standard `<head>` tags from your config and frontmatter — no configuration needed. Where a value can be tuned it lives under the `seo` key in `blume.config.ts` or under `seo` in a page's frontmatter.

- `<title>` — the page title plus your site `title`.
- `<meta name="description">` and `og:description` — the page `description`, falling back to the site `description`.
- `og:title` and `og:site_name` — the page title and your site `title`.
- `<link rel="canonical">` and `og:url` — the page's absolute URL (when [`deployment.site`](/docs/deployment) is set).
- `og:type` — `article` on blog posts and changelog entries, `website` elsewhere. Article pages also emit `article:published_time` and `article:modified_time` from the page's `date` and last-modified timestamp.
- `og:image` — the [OG image](/docs/discoverability/open-graph) for the page. A generated card also declares its `og:image:width`, `og:image:height`, `og:image:type`, and `og:image:alt`, so a crawler can lay the card out without fetching it first; an `seo.image` you supply yourself declares none of these, since its size and format are unknown.
- `twitter:card`, `twitter:title`, `twitter:description`, `twitter:image` — the X card. Pages with an image get the wide `summary_large_image` variant; pages without one still get the compact `summary` card rather than rendering as a bare link.

## X attribution

X reads everything else on the card from the `og:*` tags, so the only values it can't infer are the accounts to credit. Set them under `seo.x` and Blume emits `twitter:site` (your site's account) and `twitter:creator` (the author's). The `@` is optional — `acme` and `@acme` both work.

```ts blume.config.ts lineNumbers
seo: {
  x: { handle: "@acme", creator: "@jane" },
}
```

A page can claim its own author, which is what you want for a guest post:

```yaml lineNumbers
---
title: How we shipped it
seo:
  x:
    creator: "@guestauthor"
---
```

## Per-page overrides

Override any of the other tags per page with `seo` frontmatter:

```yaml lineNumbers
---
title: Pricing
description: Plans and pricing for every team size.
seo:
  title: Pricing — Acme
  canonical: https://acme.com/pricing
  noindex: false
---
```

| Prop | Type | Default | Description |
| - | - | - | - |
| `seo.title?` | `string` | - | Override the <title> and og:title for this page. |
| `seo.description?` | `string` | - | Override the meta + og:description. |
| `seo.image?` | `string` | - | Custom social image (see Open Graph images). |
| `seo.canonical?` | `string` | - | Override the canonical URL. |
| `seo.noindex?` | `boolean` | - | Emit robots noindex and skip structured data. |
| `seo.x.creator?` | `string` | - | Credit this page to an X account (twitter:creator), overriding seo.x.creator from your config. |

A `noindex` page also drops out of the [sitemap](/docs/discoverability/sitemap-and-robots#sitemap) and skips [structured data](/docs/discoverability/structured-data).
