---
title: head injection
description: Data-only meta and link tags — and why there is no script field.
---

`head` injects tags into every page's `<head>`.

```json
{
  "head": {
    "meta": [{ "name": "theme-color", "content": "#4E7D4A" }],
    "link": [{ "rel": "me", "href": "https://example.com/profile" }]
  }
}
```

`head.link` entries take `rel`, `href` and an optional `type`.

## There is no `head.script`

There is also no `head.raw` and no `head.style`. This is not an omission waiting to be
filled — it is the design.

A documentation platform that builds someone else's repository cannot accept arbitrary
script injection through config and remain safe to run. Keeping `head` to data-only tags
is what makes a build of untrusted content a bounded operation.

The consequences are real, and worth stating rather than hiding:

- **Analytics** goes through [`analytics`](/docs/site/analytics), a registry of known
  providers — not a script tag.
- **Stylesheets** go through `customCss`. A `head.link` with `rel: "stylesheet"` is
  rejected with a message pointing you there.
- **Anything else that needs JavaScript** has no configuration surface. If you need it,
  the honest answer today is that Reed does not support it.

## Href classification

An `href` is classified the same way everywhere in `docs.json`:

- **Root-relative** (`/something`) — base-prefixed by Reed.
- **Absolute `http(s)`** — passed through verbatim.

The same rule governs `footer.columns[].links[].url` and `footer.status.url`, so there is
one behaviour to learn rather than four.

## Ordering and duplicates

Tags are injected on every page, in the order you declare them. Reed does not deduplicate
against tags a template already emits, so declaring a `theme-color` that the template also
sets leaves two in the document. Check the built HTML if a tag appears not to take effect.
