# What changed in unhead

> 23 changes in unhead 2 to 3 from its official release notes, upgrade guides and advisories: 4 security. Each one cited. Sources checked 2026-10-23. HTML: https://unstale.sh/npm/unhead/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## unhead 3

### Security

- unhead: Streaming SSR `streamKey` injected into inline script without identifier validation (3.0.1) — [security advisory](https://github.com/advisories/GHSA-X7MM-9VVV-64W8)

### Fixes and other changes

- The ESLint fixer now trims leftover space when removing a mid-object property. (3.4.3) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.3)
- Non-string textContent is now stringified in hashTag. (3.4.3) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.3)
- False values now render negative robots directives. (3.4.3) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.3)
- Script consumers are now disposed with their effect scope. (3.4.3) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.3)
- Numeric template parameters, including 0, are now kept. (3.4.3) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.3)
- A warning is now issued for template tokens when the plugin is absent. (3.4.3) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.3)
- twitter:card is now inferred from the resolved image. (3.4.3) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.3)
- Vapor head entries are now disposed on scope teardown. (3.4.3) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.3)
- The canonical link can set the graph URL. (3.4.2) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.2)
- The devtools runtime plugin is registered only once. (3.4.2) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.2)
- Streaming preserves body tags and requests script nonces. (3.4.2) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.2)
- Initial head tags are kept in the streamed shell. (3.4.2) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.2)
- Schema.org reads the description and og:image values from useSeoMeta. (3.4.2) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.2)
- HTTP-prefixed relative canonical URLs are resolved. (3.4.1) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.1)
- The devtools payload is rendered after validation. (3.4.1) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.1)
- The bundler now injects the resolved path for the devtools runtime plugin. (3.4.1) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.1)
- Vite and stream support manifest-mode transformIndexHtml(). (3.4.1) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.1)
- Relative warmup URLs passed to useScript are handled. (3.4.1) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.1)
- Warnings are reduced for normal Nuxt output. (3.4.1) — [release notes](https://github.com/unjs/unhead/releases/tag/v3.4.1)

## unhead 2

### Security

- Unhead has a hasDangerousProtocol() bypass via leading-zero padded HTML entities in useHeadSafe() (2.1.13) — [security advisory](https://github.com/advisories/GHSA-95H2-GJ7X-GX9W)
- Unhead has XSS bypass in `useHeadSafe` via attribute name injection and case-sensitive protocol check (2.1.11) — [security advisory](https://github.com/advisories/GHSA-G5XX-PWRP-G3FV)
- Unhead Vulnerable to Bypass of URI Scheme Sanitization in makeTagSafe via Case-Sensitivity (2.1.11) — [security advisory](https://github.com/advisories/GHSA-5339-HVWR-7582)
