Skip to content

head injection

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 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, 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.

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.

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.