---
title: "Releases · Unhead"
canonical_url: "https://unhead.unjs.io/releases"
last_updated: "2026-07-20T09:35:44.507Z"
meta:
  description: "Unhead is the any-framework document head manager built for performance and delightful developer experience."
  "og:description": "Unhead is the any-framework document head manager built for performance and delightful developer experience."
  "og:title": "Releases · Unhead"
---

Home

`
Unhead on GitHub

## **Release Notes **

Last fetched: just now.

See [GitHub Releases](https://github.com/unjs/unhead/releases) for realtime updates.

- yesterday [<h3>v 3.2.**1**** Latest release **</h3>Release v3.2.1](https://github.com/unjs/unhead/releases/tag/v3.2.1) ###    🐞 Bug Fixes
  - **bundler**: Preserve head.ssr mutation targets  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/866~~**](https://github.com/unjs/unhead/issues/866) [`(e8ef3)`](https://github.com/unjs/unhead/commit/e8ef34ab) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.2.0...v3.2.1) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.2.1)
- yesterday [<h3>v 3.**2.0**</h3>Release v3.2.0](https://github.com/unjs/unhead/releases/tag/v3.2.0) ###    🚀 Features
  - **scripts**:
    - Add async readiness and consumer scopes  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/840~~**](https://github.com/unjs/unhead/issues/840) [`(bbdc1)`](https://github.com/unjs/unhead/commit/bbdc1de4)
    - Add opt-in trigger primitives  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/856~~**](https://github.com/unjs/unhead/issues/856) [`(cf5a9)`](https://github.com/unjs/unhead/commit/cf5a92ac)
  - **server**:
    - Experimental `**prepareTemplate**`  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/830~~**](https://github.com/unjs/unhead/issues/830) [`(0b8ca)`](https://github.com/unjs/unhead/commit/0b8cac84) ###    🐞 Bug Fixes
  - Tolerate mixed Unhead majors in Nuxt builds  -  by @harlan-zw [`(680c0)`](https://github.com/unjs/unhead/commit/680c0997)
  - **bundler**:
    - Correct build-target detection for transforms  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/829~~**](https://github.com/unjs/unhead/issues/829) [`(ea148)`](https://github.com/unjs/unhead/commit/ea14841b)
  - **react**:
    - Export provider prop types  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/854~~**](https://github.com/unjs/unhead/issues/854) [`(d15af)`](https://github.com/unjs/unhead/commit/d15afb3e)
  - **schema-org**:
    - Export missing node types  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/852~~**](https://github.com/unjs/unhead/issues/852) [`(f5bf5)`](https://github.com/unjs/unhead/commit/f5bf547a)
  - **stream**:
    - Respect backpressure/cancellation  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/827~~**](https://github.com/unjs/unhead/issues/827) [`(6395a)`](https://github.com/unjs/unhead/commit/6395a123)
    - Prevent Rollup from rewriting generated IIFE  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/863~~**](https://github.com/unjs/unhead/issues/863) [`(f6cda)`](https://github.com/unjs/unhead/commit/f6cda823)
  - **types**:
    - Expose public extension types  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/849~~**](https://github.com/unjs/unhead/issues/849) [`(83404)`](https://github.com/unjs/unhead/commit/834047c8)
    - Preserve define helper properties  -  by @harlan-zw [`(b042a)`](https://github.com/unjs/unhead/commit/b042a27c)
  - **unhead**:
    - Dedupe link tags by rel + href  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/824~~**](https://github.com/unjs/unhead/issues/824) [`(c364e)`](https://github.com/unjs/unhead/commit/c364e9e0)
    - Align Promise handling with sync rendering  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/839~~**](https://github.com/unjs/unhead/issues/839) [`(c5940)`](https://github.com/unjs/unhead/commit/c594054d) ###    🏎 Performance
  - **unhead**:
    - Precompute SSR init tags  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/828~~**](https://github.com/unjs/unhead/issues/828) [`(b6bf7)`](https://github.com/unjs/unhead/commit/b6bf7fac)
    - Reduce resolver allocations  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/838~~**](https://github.com/unjs/unhead/issues/838) [`(2a3cd)`](https://github.com/unjs/unhead/commit/2a3cd448) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.8...v3.2.0) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.2.0)
- yesterday [<h3>v 2.1.**16**</h3>Release v2.1.16](https://github.com/unjs/unhead/releases/tag/v2.1.16) ###    🐞 Bug Fixes
  - **vue**: Expose v2 legacy plugins  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/861~~**](https://github.com/unjs/unhead/issues/861) [`(3023d)`](https://github.com/unjs/unhead/commit/3023d141) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.15...v2.1.16) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.16)
- last week [<h3>v 3.1.**8**</h3>Release v3.1.8](https://github.com/unjs/unhead/releases/tag/v3.1.8) ###    🐞 Bug Fixes
  - **types**: Allow `**media**` on icon links  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/821~~**](https://github.com/unjs/unhead/issues/821) [`(ce57f)`](https://github.com/unjs/unhead/commit/ce57fd05) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.7...v3.1.8) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.8)
- 3 weeks ago [<h3>v 3.1.**7**</h3>Release v3.1.7](https://github.com/unjs/unhead/releases/tag/v3.1.7) ###    🐞 Bug Fixes
  - Guard plugins against double registration  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/791~~**](https://github.com/unjs/unhead/issues/791) [`(2bb78)`](https://github.com/unjs/unhead/commit/2bb78f87)
  - Harden head rendering malformed input  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/814~~**](https://github.com/unjs/unhead/issues/814) [`(a18e2)`](https://github.com/unjs/unhead/commit/a18e2e2e)
  - Reduce minimal bundle size  -  by @harlan-zw [`(37600)`](https://github.com/unjs/unhead/commit/37600d64)
  - Satisfy bundle size type checks  -  by @harlan-zw [`(e8a77)`](https://github.com/unjs/unhead/commit/e8a77fbf)
  - Keep vue server exports scoped  -  by @harlan-zw [`(dae11)`](https://github.com/unjs/unhead/commit/dae110bf)
  - Harden script registry keys  -  by @harlan-zw [`(5557f)`](https://github.com/unjs/unhead/commit/5557fcfa)
  - **angular**:
    - Correct package type exports  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/802~~**](https://github.com/unjs/unhead/issues/802) [`(9e150)`](https://github.com/unjs/unhead/commit/9e15062b)
    - Request-scope the server head  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/810~~**](https://github.com/unjs/unhead/issues/810) [`(7d8e4)`](https://github.com/unjs/unhead/commit/7d8e4f60)
  - **bundler**:
    - Lazy-load Vite devtools plugin behind Vite hooks  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/790~~**](https://github.com/unjs/unhead/issues/790) [`(e66e2)`](https://github.com/unjs/unhead/commit/e66e25ed)
  - **dom**:
    - Correct and optimize the client DOM renderer  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/787~~**](https://github.com/unjs/unhead/issues/787) [`(ace35)`](https://github.com/unjs/unhead/commit/ace356f0)
  - **react**:
    - Make composables StrictMode double-invoke safe  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/809~~**](https://github.com/unjs/unhead/issues/809) [`(7a5ba)`](https://github.com/unjs/unhead/commit/7a5ba0c3)
  - **schema-org**:
    - Missing subpath exports and vue import cycle  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/785~~**](https://github.com/unjs/unhead/issues/785) [`(10a21)`](https://github.com/unjs/unhead/commit/10a21dad)
  - **solid-js**:
    - Harden streaming wrapper  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/804~~**](https://github.com/unjs/unhead/issues/804) [`(9b383)`](https://github.com/unjs/unhead/commit/9b383286)
  - **streaming**:
    - Use emitted Vite IIFE asset URL  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/789~~**](https://github.com/unjs/unhead/issues/789) [`(4e368)`](https://github.com/unjs/unhead/commit/4e368bce)
  - **unhead**:
    - Identity-based useScript callback and trigger cleanup  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/807~~**](https://github.com/unjs/unhead/issues/807) [`(67d35)`](https://github.com/unjs/unhead/commit/67d35ca3)
  - **vue**:
    - Avoid render-scoped Head watchers  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/806~~**](https://github.com/unjs/unhead/issues/806) [`(48e30)`](https://github.com/unjs/unhead/commit/48e3029c)
    - Normalize useSeoMeta patches  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/805~~**](https://github.com/unjs/unhead/issues/805) [`(dc2b8)`](https://github.com/unjs/unhead/commit/dc2b801f)
  - **vue,svelte,angular,solid**:
    - Dispose useScript callbacks by identity  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/808~~**](https://github.com/unjs/unhead/issues/808) [`(b796a)`](https://github.com/unjs/unhead/commit/b796acf9) ###    🏎 Performance
  - Optimize SSR hot paths  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/794~~**](https://github.com/unjs/unhead/issues/794) [`(f806f)`](https://github.com/unjs/unhead/commit/f806f813)
  - Reduce bundle size  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/817~~**](https://github.com/unjs/unhead/issues/817) [`(89781)`](https://github.com/unjs/unhead/commit/897819c6)
  - **schema-org**:
    - Skip unused duplicate cleanup  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/816~~**](https://github.com/unjs/unhead/issues/816) [`(90ab8)`](https://github.com/unjs/unhead/commit/90ab8cd7)
    - Reduce entry normalization  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/815~~**](https://github.com/unjs/unhead/issues/815) [`(aa9c7)`](https://github.com/unjs/unhead/commit/aa9c75c4)
  - **ssr**:
    - Self-closing tag hot path  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/801~~**](https://github.com/unjs/unhead/issues/801) [`(dafb4)`](https://github.com/unjs/unhead/commit/dafb4307)
  - **unhead**:
    - Avoid fallback hash allocations  -  by @TheAlexLichter in [**~~https://github.com/unjs/unhead/issues/784~~**](https://github.com/unjs/unhead/issues/784) [`(9916b)`](https://github.com/unjs/unhead/commit/9916b190)
    - Structural-sharing walkResolver to cut SSR allocation  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/812~~**](https://github.com/unjs/unhead/issues/812) [`(7dbdc)`](https://github.com/unjs/unhead/commit/7dbdcc40)
    - Remove the dead unhead:payload mechanism  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/813~~**](https://github.com/unjs/unhead/issues/813) [`(9cb64)`](https://github.com/unjs/unhead/commit/9cb64309) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.6...v3.1.7) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.7)
- 4 weeks ago [<h3>v 3.1.**6**</h3>Release v3.1.6](https://github.com/unjs/unhead/releases/tag/v3.1.6) ###    🏎 Performance
  - **bundler**: Add further transform hook filters  -  by @TheAlexLichter in [**~~https://github.com/unjs/unhead/issues/783~~**](https://github.com/unjs/unhead/issues/783) [`(24704)`](https://github.com/unjs/unhead/commit/2470401a) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.5...v3.1.6) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.6)
- 4 weeks ago [<h3>v 3.1.**5**</h3>Release v3.1.5](https://github.com/unjs/unhead/releases/tag/v3.1.5) ###    🐞 Bug Fixes
  - **vue**: Return a no-op entry from clientUseHead when the scope is dead  -  by @williamchong and **William Chong** in [**~~https://github.com/unjs/unhead/issues/778~~**](https://github.com/unjs/unhead/issues/778) [`(9cc71)`](https://github.com/unjs/unhead/commit/9cc71e2e) ###    🏎 Performance
  - **bundler**:
    - Filter transforms by source  -  by @TheAlexLichter in [**~~https://github.com/unjs/unhead/issues/781~~**](https://github.com/unjs/unhead/issues/781) [`(f5614)`](https://github.com/unjs/unhead/commit/f5614b47)
    - Optimize minify transform  -  by @TheAlexLichter and @harlan-zw in [**~~https://github.com/unjs/unhead/issues/780~~**](https://github.com/unjs/unhead/issues/780) [`(cc9c3)`](https://github.com/unjs/unhead/commit/cc9c36cb)
    - Reduce unplugin transform overhead  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/782~~**](https://github.com/unjs/unhead/issues/782) [`(79106)`](https://github.com/unjs/unhead/commit/79106e4e) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.4...v3.1.5) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.5)
- last month [<h3>v 3.1.**4**</h3>Release v3.1.4](https://github.com/unjs/unhead/releases/tag/v3.1.4) ###    🐞 Bug Fixes
  - **bundler**:
    - Resolve dynamic ogImage in useSeoMeta transform  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/770~~**](https://github.com/unjs/unhead/issues/770) [`(06a85)`](https://github.com/unjs/unhead/commit/06a859b6)
  - **scripts**:
    - Resolve useScript load promise via microtask  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/772~~**](https://github.com/unjs/unhead/issues/772) [`(d3cc3)`](https://github.com/unjs/unhead/commit/d3cc3b14)
  - **types**:
    - Correct `**music.radio_station**` + add `**payment.link**` OG  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/775~~**](https://github.com/unjs/unhead/issues/775) [`(80027)`](https://github.com/unjs/unhead/commit/800273a2)
  - **unhead**:
    - Avoid crash on script template params with no type  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/773~~**](https://github.com/unjs/unhead/issues/773) [`(90e75)`](https://github.com/unjs/unhead/commit/90e7545e)
    - Parse HTML attribute values without backslash escaping  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/774~~**](https://github.com/unjs/unhead/issues/774) [`(88c9d)`](https://github.com/unjs/unhead/commit/88c9d6d1) ###    🏎 Performance
  - **unhead**: Skip defensive tag clones when no mutating hooks registered  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/776~~**](https://github.com/unjs/unhead/issues/776) [`(032f2)`](https://github.com/unjs/unhead/commit/032f2c1d) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.3...v3.1.4) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.4)
- 2 months ago [<h3>v 3.1.**3**</h3>Release v3.1.3](https://github.com/unjs/unhead/releases/tag/v3.1.3) ###    🐞 Bug Fixes
  - **bundler**: Resolve devtools bridge and UI assets from package root  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/768~~**](https://github.com/unjs/unhead/issues/768) [`(78bcb)`](https://github.com/unjs/unhead/commit/78bcbbaa) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.2...v3.1.3) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.3)
- 2 months ago [<h3>v 3.1.**2**</h3>Release v3.1.2](https://github.com/unjs/unhead/releases/tag/v3.1.2) ###    🐞 Bug Fixes
  - **server**: Re-expose `**omitLineBreaks**` render option  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/767~~**](https://github.com/unjs/unhead/issues/767) [`(95604)`](https://github.com/unjs/unhead/commit/95604251) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.1...v3.1.2) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.2)
- 2 months ago [<h3>v 3.1.**1**</h3>Release v3.1.1](https://github.com/unjs/unhead/releases/tag/v3.1.1) ###    🐞 Bug Fixes
  - Scope alternate link dedupeKey by href when type is used  -  by @EduardF1 in [**~~https://github.com/unjs/unhead/issues/759~~**](https://github.com/unjs/unhead/issues/759) [`(e8699)`](https://github.com/unjs/unhead/commit/e869944d)
  - **types**: Support union rel/type in defineLink and defineScript  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/765~~**](https://github.com/unjs/unhead/issues/765) [`(e4663)`](https://github.com/unjs/unhead/commit/e4663ebc) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.1.0...v3.1.1) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.1)
- 2 months ago [<h3>v 2.1.**15**</h3>Release v2.1.15](https://github.com/unjs/unhead/releases/tag/v2.1.15)

  _No significant changes_#####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.14...v2.1.15) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.15)
- 2 months ago [<h3>v 2.1.**14**</h3>Release v2.1.14](https://github.com/unjs/unhead/releases/tag/v2.1.14) ###    🐞 Bug Fixes
  - Scope alternate link dedupeKey by href when type is used  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/760~~**](https://github.com/unjs/unhead/issues/760) [`(10846)`](https://github.com/unjs/unhead/commit/10846b59) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.13...v2.1.14) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.14)
- 3 months ago [<h3>v 3.**1.0**</h3>Release v3.1.0](https://github.com/unjs/unhead/releases/tag/v3.1.0) ### 🛠️ Unhead CLI

  To assist with migrations and overall DX a CLI has been introduced: `**@unhead/cli**`.

  ```
  npx -y @unhead/cli
  ```

  It lets you do the following:

  ```
            audit    Lint your codebase for unhead misuse, type-narrowing issues, and SEO/perf foot-guns.                      
          migrate    Apply autofixes for v2-to-v3 migration: rewrite deprecated props and wrap tag literals in defineX helpers.
    validate-html    Run the runtime ValidatePlugin over prerendered HTML files (e.g. dist/, .output/, build/).                
     validate-url    Fetch a rendered URL and run unhead\'s SEO/perf validation rules over its <head>.
  ```

  For example, try running `**audit**` on your own project for hints on how to improve your SEO. ### ✔️ Unhead ESLint

  Knowing that your useHead() and useSeoMeta() code is right while your coding is important. While type-narrowing solves many broken cases, we introduce an ESLint plugin to help catch anything that the typechecker can't catch.

  These rules are shared from the runtime `**ValidatePlugin**`

  ```
  # flat-config ESLint plugin with v2→v3 migration autofixes
  npm i -D @unhead/eslint-plugin
  ```

  

  ```
  \`\`\`ts [eslint.config.ts]
  import { configs } from '@unhead/eslint-plugin'

  export default [
    configs.recommended,
  ]
  ```

  ### 🌊 Streaming SSR non-Vite support

  The streaming plugin lived only at `**unhead/stream/vite**` previously, leaving non-Vite users with no way to wire the bootstrap. The plugin is now a bundler-agnostic `**unplugin**` factory with first-class webpack and Vite entries, and the framework packages compose it behind `**Unhead({ streaming: true })**`.

  ```
  // vite.config.ts
  import { Unhead } from '@unhead/vue/vite'
  export default { plugins: [vue(), Unhead({ streaming: true })] }

  // webpack.config.ts
  import { Unhead } from '@unhead/vue/bundler'
  export default { plugins: [...Unhead({ streaming: true }).webpack()] }
  ```

  Streaming also gains a `**nonce**` option (forwarded on every injected `**<script>**` for CSP support), a fixed `**async**` mode for production Vite builds (the IIFE is now emitted via `**this.emitFile()**` so the script src references a real hashed asset), a dev-mode warning when the client IIFE runs against an empty server queue, and a shared `**StreamingGlobal**` type so the server bootstrap, client, and injected IIFE agree on the shape of `**window.__unhead__**`. Default mode changed from `**async**` to `**inline**` for smaller TTFB. ## Changelog ###    🚀 Features
  - **cli,eslint-plugin**:
    - Add @unhead/cli and @unhead/eslint-plugin  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/755~~**](https://github.com/unjs/unhead/issues/755) [`(9e300)`](https://github.com/unjs/unhead/commit/9e30013a)
  - **stream**:
    - Unify framework plugins as Unhead({ streaming: true }) per bundler  -  by @harlan-zw [`(63c03)`](https://github.com/unjs/unhead/commit/63c03692)
    - Webpack plugin + bundler-agnostic factory  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/751~~**](https://github.com/unjs/unhead/issues/751) [`(3ed06)`](https://github.com/unjs/unhead/commit/3ed063c6) ###    🐞 Bug Fixes
  - **stream**:
    - Add missing webpack/rspack/rollup plugin entries  -  by @harlan-zw [`(7feae)`](https://github.com/unjs/unhead/commit/7feae067)
    - Address coderabbit review comments  -  by @harlan-zw [`(180f4)`](https://github.com/unjs/unhead/commit/180f44f8)
    - Restore unhead/stream/vite as deprecation stub + re-add moduleType  -  by @harlan-zw [`(feee2)`](https://github.com/unjs/unhead/commit/feee25b3)
  - **vue**:
    - Batch streamed head updates via self-deleting inline scripts  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/752~~**](https://github.com/unjs/unhead/issues/752) [`(40f77)`](https://github.com/unjs/unhead/commit/40f777b4) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.0.5...v3.1.0) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.1.0)
- 3 months ago [<h3>v 3.0.**5**</h3>Release v3.0.5](https://github.com/unjs/unhead/releases/tag/v3.0.5) ###    🐞 Bug Fixes
  - **bundler**:
    - Preserve useSeoMeta import when sibling call is untransformable  -  by @harlan-zw [`(8ea48)`](https://github.com/unjs/unhead/commit/8ea4834a)
    - Preserve useSeoMeta import when sibling call is untransformable  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/749~~**](https://github.com/unjs/unhead/issues/749) [`(f7176)`](https://github.com/unjs/unhead/commit/f717645c)
  - **types**:
    - Export new link rel types from #744  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/745~~**](https://github.com/unjs/unhead/issues/745) and [**~~https://github.com/unjs/unhead/issues/744~~**](https://github.com/unjs/unhead/issues/744) [`(af549)`](https://github.com/unjs/unhead/commit/af54923c)
  - **vue**:
    - Symmetric HeadStream vnodes for clean streaming hydration  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/748~~**](https://github.com/unjs/unhead/issues/748) [`(e860d)`](https://github.com/unjs/unhead/commit/e860d62d) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.0.4...v3.0.5) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.0.5)
- 3 months ago [<h3>v 3.0.**4**</h3>Release v3.0.4](https://github.com/unjs/unhead/releases/tag/v3.0.4) ###    🐞 Bug Fixes
  - **types**: Missing `**rel**` sitemap, amphtml, hub, apple-touch-startup-image  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/744~~**](https://github.com/unjs/unhead/issues/744) [`(578da)`](https://github.com/unjs/unhead/commit/578da8a3) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.0.3...v3.0.4) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.0.4)
- 3 months ago [<h3>v 3.0.**3**</h3>Release v3.0.3](https://github.com/unjs/unhead/releases/tag/v3.0.3) ###    🐞 Bug Fixes
  - **bundler**:
    - Disable SSRStaticReplace in vite dev mode  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/739~~**](https://github.com/unjs/unhead/issues/739) [`(13121)`](https://github.com/unjs/unhead/commit/13121c64)
  - **legacy**:
    - Restore exports for v2 migration  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/741~~**](https://github.com/unjs/unhead/issues/741) [`(c400d)`](https://github.com/unjs/unhead/commit/c400d4fa)
  - **types**:
    - Prevent string widening in SpeculationRules nested types  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/737~~**](https://github.com/unjs/unhead/issues/737) [`(2d097)`](https://github.com/unjs/unhead/commit/2d097ca4) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.0.2...v3.0.3) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.0.3)
- 3 months ago [<h3>v 3.0.**2**</h3>Release v3.0.2](https://github.com/unjs/unhead/releases/tag/v3.0.2) ###    🐞 Bug Fixes
  - **types**: Accept readonly and as const inputs  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/736~~**](https://github.com/unjs/unhead/issues/736) [`(5ccf9)`](https://github.com/unjs/unhead/commit/5ccf98e0) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.0.1...v3.0.2) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.0.2)
- 3 months ago [<h3>v 3.0.**1**</h3>Release v3.0.1](https://github.com/unjs/unhead/releases/tag/v3.0.1) ###    🐞 Bug Fixes
  - Proper script `**importmap**` & `**speculationrules**` handling  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/734~~**](https://github.com/unjs/unhead/issues/734) [`(8027f)`](https://github.com/unjs/unhead/commit/8027f76d)
  - Better type narrowing escape hatches for custom rel/type  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/735~~**](https://github.com/unjs/unhead/issues/735) [`(06b4a)`](https://github.com/unjs/unhead/commit/06b4a5cb) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v3.0.0...v3.0.1) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.0.1)
- 3 months ago [<h3>v**3.0.0**</h3>Release v3.0.0](https://github.com/unjs/unhead/releases/tag/v3.0.0)

  Unhead v3 rebuilds the rendering engine from the ground up. The motivation: **streaming SSR**. Frameworks like Nuxt, SolidStart, and SvelteKit stream HTML to the browser as data loads, but head tags were still stuck in a request/response model, resolved once and never updated. To fix this properly, we had to make rendering synchronous, pluggable, and side-effect free. The result is a faster, smaller, and more capable head manager. ## 📣 Highlights ### 🌊 Streaming SSR

  Head tags now update dynamically as suspense boundaries resolve during streaming. As each chunk streams to the browser, new `**<title>**`, `**<meta>**`, and `**<link>**` tags are pushed to a client-side queue and applied to the DOM. No waiting for the full page to load.

  ```
  // entry-server.ts
  import { createStreamableHead } from '@unhead/vue/stream/server'

  const { head, wrapStream } = createStreamableHead()
  app.use(head)

  // wraps the Vue stream, injecting head updates as chunks resolve
  return wrapStream(renderToWebStream(app), template)
  ```

  

  ```
  // entry-client.ts
  import { createStreamableHead } from '@unhead/vue/stream/client'

  const head = createStreamableHead()
  app.use(head)
  ```

  Under the hood: a queue stub ( `**window.__unhead__**`) collects head entries as they stream in before the main JS bundle loads. Once the client head instance initializes, it processes the queue and takes over. No entries are ever lost regardless of timing.

  Streaming is supported for Vue, React, Solid.js, Svelte, and vanilla TypeScript. See [**~~PR #537~~**](https://github.com/unjs/unhead/pull/537). ### 🛠️ Unified Vite Plugin + DevTools

  A single `**@unhead/{framework}/vite**` plugin replaces the old manual composition of `**@unhead/addons**` + streaming plugin + framework glue. One import, one call, and you get tree-shaking, `**useSeoMeta**` → `**useHead**` transform, inline minification, streaming SSR, dev-mode `**ValidatePlugin**` auto-injection, and **Vite DevTools** integration.

  ```
  // vite.config.ts
  import { Unhead } from '@unhead/vue/vite'
  import vue from '@vitejs/plugin-vue'

  export default defineConfig({
    plugins: [vue(), Unhead()],
  })
  ```

  The DevTools panel surfaces live head state during development: every `**useHead()**` / `**useSeoMeta()**` call with its source file and line number, resolved tags, SEO overview (title, description, canonical, Open Graph), `**useScript()**` load status, active plugins, template params, and warnings from the Validate plugin. Source tracing lets you click through from any tag back to the exact line that created it.

  Available for Vue, React, Svelte, Solid, and vanilla via `**@unhead/bundler/vite**` (the renamed `**@unhead/addons**` package; the old name still works with a deprecation warning).

  See PRs [**~~#726~~**](https://github.com/unjs/unhead/pull/726), [**~~#733~~**](https://github.com/unjs/unhead/pull/733), [**~~#731~~**](https://github.com/unjs/unhead/pull/731). ### 🎯 `**useHead()**` Type Narrowing

  `**useHead()**` now narrows types based on input. Link, script, and meta tags resolve to specific subtypes instead of a generic union, so you get precise autocomplete and type errors when something is wrong.

  ```
  useHead({
    link: [
      // Narrows to StylesheetLink: requires href, offers media, integrity, etc.
      { rel: 'stylesheet', href: '/styles.css' },
      // Narrows to PreloadLink: requires as attribute
      { rel: 'preload', as: 'font', href: '/font.woff2', crossorigin: 'anonymous' },
    ],
    script: [
      // Narrows to ModuleScript
      { src: '/app.mjs', type: 'module' },
      // Narrows to JsonLdScript
      { type: 'application/ld+json', innerHTML: '{}' },
    ],
  })
  ```

  See PRs [**~~#627~~**](https://github.com/unjs/unhead/pull/627), [**~~#665~~**](https://github.com/unjs/unhead/pull/665), [**~~#729~~**](https://github.com/unjs/unhead/pull/729). ### ✅ ValidatePlugin

  New optional `**ValidatePlugin**` that inspects resolved head output and warns about common mistakes: missing titles, duplicate meta tags, contradictory preload priorities, render-blocking scripts, late `**<meta charset>**`, too many `**fetchpriority="high"**` hints, preconnect without `**crossorigin**`, and more. Also includes **v2 migration rules** that detect deprecated property names ( `**children**`, `**hid**`/ `**vmid**`, `**body: true**`), missing `**TemplateParamsPlugin**`, and missing `**AliasSortingPlugin**` — all of which cause silent breakage on upgrade. Auto-injected in dev by the unified Vite plugin so warnings surface in the browser console without any manual setup. Fully tree-shakeable. Rules use ESLint-style flat config:

  ```
  import { ValidatePlugin } from 'unhead/plugins'

  createHead({
    plugins: [
      ValidatePlugin({
        rules: {
          'missing-description': 'off',
        }
      })
    ]
  })
  ```

  See PRs [**~~#690~~**](https://github.com/unjs/unhead/pull/690), [**~~#691~~**](https://github.com/unjs/unhead/pull/691), [**~~#716~~**](https://github.com/unjs/unhead/pull/716), [**~~#722~~**](https://github.com/unjs/unhead/pull/722), [**~~#725~~**](https://github.com/unjs/unhead/pull/725), [**~~#732~~**](https://github.com/unjs/unhead/pull/732). ### 🔗 Canonical Plugin

  New built-in `**CanonicalPlugin**` that auto-generates `**<link rel="canonical">**` tags and resolves relative URLs to absolute in `**og:image**`, `**twitter:image**`, and `**og:url**`. Includes query parameter filtering (strips tracking params like `**utm_source**`, `**fbclid**`, `**gclid**` by default), trailing slash normalization, and automatic hash fragment stripping. Essential for SEO and social sharing.

  ```
  import { CanonicalPlugin } from 'unhead/plugins'

  createHead({
    plugins: [
      CanonicalPlugin({
        canonicalHost: 'https://mysite.com',
        trailingSlash: true,
        queryWhitelist: ['page', 'sort'],
      })
    ]
  })
  ```

  See PRs [**~~#492~~**](https://github.com/unjs/unhead/pull/492), [**~~#713~~**](https://github.com/unjs/unhead/pull/713). ### 🗜️ MinifyPlugin

  New optional `**MinifyPlugin**` that minifies inline `**<script>**` and `**<style>**` tag content during SSR. Uses lightweight pure-JS minifiers with zero native dependencies, safe for edge and serverless runtimes. A companion build-time transform ( `**MinifyTransform**` in `**@unhead/bundler**`) pre-minifies static `**innerHTML**` literals at compile time. Standalone utilities ( `**minifyJS**`, `**minifyCSS**`, `**minifyJSON**`) are also available via `**unhead/minify**`.

  ```
  import { MinifyPlugin } from 'unhead/plugins'

  createHead({
    plugins: [MinifyPlugin()]
  })
  ```

  See [**~~PR #705~~**](https://github.com/unjs/unhead/pull/705). ## 📦 Performance | **Build** | **v3 size** | **v2 size** | **Delta gz** |
| --- | --- | --- | --- | | client | 10254 | 11513 | **-534 (-11.2%)** | | server | 9894 | 10361 | -194 (-4.6%) | | vueClient | 11323 | 12567 | -533 (-10.2%) | | vueServer | 10849 | 11312 | -191 (-4.1%) | | **Benchmark** | **v2 mean** | **v3 mean** | **Delta** |
| --- | --- | --- | --- | | @unhead/vue | 0.106ms | 0.072ms | **32% faster** | | core | 0.088ms | 0.073ms | **17% faster** |

  Key optimizations:
  - Client-only CAPO sorting ([**~~#626~~**](https://github.com/unjs/unhead/pull/626))
  - Pure, tree-shakeable core with no side effects ([**~~#632~~**](https://github.com/unjs/unhead/pull/632))
  - Minified internal DOM state properties ([**~~#635~~**](https://github.com/unjs/unhead/pull/635))
  - Migrated unplugins from `**estree-walker**`/ `**acorn-loose**` to `**oxc-walker**` ([**~~#663~~**](https://github.com/unjs/unhead/pull/663))
  - Walker-based `**transformHtmlTemplate**` ([**~~#581~~**](https://github.com/unjs/unhead/pull/581))
  - `**TemplateParamsPlugin**` and `**AliasSortingPlugin**` made opt-in for smaller bundles ([**~~#493~~**](https://github.com/unjs/unhead/pull/493), [**~~#494~~**](https://github.com/unjs/unhead/pull/494)) ## 📊 Schema.org
  - **12 new nodes**: `**Dataset**`, `**MusicAlbum**`, `**MusicGroup**`, `**MusicPlaylist**`, `**MusicRecording**`, `**PodcastEpisode**`, `**PodcastSeason**`, `**PodcastSeries**`, `**Service**`, `**TVEpisode**`, `**TVSeason**`, `**TVSeries**` ([**~~#612~~**](https://github.com/unjs/unhead/pull/612))
  - **Graph resolution rewrite** for correctness and performance ([**~~#616~~**](https://github.com/unjs/unhead/pull/616))
  - **Removed `**ohash**` and `**defu**` dependencies** ([**~~#605~~**](https://github.com/unjs/unhead/pull/605)) ## 🔄 Other Changes
  - `**renderDOMHead()**` / `**renderSSRHead()**` are now fully synchronous, single-pass via a composable `**resolveTags()**` pipeline; the head instance exposes a pluggable `**render()**` function for framework integrations ([**~~#619~~**](https://github.com/unjs/unhead/pull/619), [**~~#622~~**](https://github.com/unjs/unhead/pull/622), [**~~#628~~**](https://github.com/unjs/unhead/pull/628), [**~~#629~~**](https://github.com/unjs/unhead/pull/629), [**~~#630~~**](https://github.com/unjs/unhead/pull/630))
  - `**@unhead/react/helmet**` drop-in compat export for users migrating from `**react-helmet**` ([**~~#719~~**](https://github.com/unjs/unhead/pull/719))
  - `**useHeadSafe()**` now whitelists CSS styles ([**~~#491~~**](https://github.com/unjs/unhead/pull/491))
  - Support for `**blocking**` attribute on scripts and stylesheets ([**~~#489~~**](https://github.com/unjs/unhead/pull/489))
  - `**useScript()**` consolidated back into core, legacy support dropped ([**~~#498~~**](https://github.com/unjs/unhead/pull/498))
  - `**fediverse:creator**` meta tag support ([**~~#703~~**](https://github.com/unjs/unhead/pull/703))
  - Switched from `**hookable**` to lighter `**HookableCore**` with sync-only hooks ([**~~#631~~**](https://github.com/unjs/unhead/pull/631))
  - Deprecation warnings added to aliased packages ( `**@unhead/schema**`, `**@unhead/shared**`) ([**~~#678~~**](https://github.com/unjs/unhead/pull/678))
  - `**templateParams**` extensible via module augmentation ([**~~#679~~**](https://github.com/unjs/unhead/pull/679))
  - Respect user-provided `**twitter:card**` in `**InferSeoMetaPlugin**` ([**~~#681~~**](https://github.com/unjs/unhead/pull/681))
  - Enforce `**as**` attribute for preload links ([**~~#683~~**](https://github.com/unjs/unhead/pull/683))
  - `**onRendered**` callback option on `**useHead()**` for synchronizing with DOM head updates ([**~~#712~~**](https://github.com/unjs/unhead/pull/712))
  - `**tagWeight**` option on `**createHead()**` to override default CAPO tag weight function ([**~~#716~~**](https://github.com/unjs/unhead/pull/716)) ## 🐛 Bug Fixes
  - Hydration race condition with deferred patches ([**~~#634~~**](https://github.com/unjs/unhead/pull/634))
  - Process pending patches even when dirty is false ([**~~#636~~**](https://github.com/unjs/unhead/pull/636))
  - Deduplicate matching tags inside same render cycle ([**~~#668~~**](https://github.com/unjs/unhead/pull/668))
  - Dedupe `**<link rel="alternate">**` correctly ([**~~#655~~**](https://github.com/unjs/unhead/pull/655), [**~~#656~~**](https://github.com/unjs/unhead/pull/656), [**~~#658~~**](https://github.com/unjs/unhead/pull/658))
  - React: dispose head entries on unmount in StrictMode ([**~~#664~~**](https://github.com/unjs/unhead/pull/664))
  - React: force invalidation on entry disposal ([**~~#559~~**](https://github.com/unjs/unhead/pull/559))
  - Vue: support computed getter trigger ([**~~#638~~**](https://github.com/unjs/unhead/pull/638))
  - Vue: expose `**@unhead/vue/stream/iife**` with correct types ([**~~#707~~**](https://github.com/unjs/unhead/pull/707))
  - Scripts: prevent scope disposal from aborting unrelated trigger ([**~~#660~~**](https://github.com/unjs/unhead/pull/660))
  - Schema.org: allow `**null**` to opt out of default values ([**~~#680~~**](https://github.com/unjs/unhead/pull/680))
  - Schema.org: normalize `**target**` to array before merging `**potentialAction**` ([**~~#709~~**](https://github.com/unjs/unhead/pull/709))
  - Avoid mutating cached `**titleTemplate**` tag in `**resolveTitleTemplate**` ([**~~#715~~**](https://github.com/unjs/unhead/pull/715)) ## ⚠️ Breaking Changes ### Synchronous rendering

  `**renderDOMHead()**` and `**renderSSRHead()**` no longer return promises. Remove `**await**`. ### Build plugins: `**@unhead/addons**` → `**@unhead/bundler**` ([**~~#726~~**](https://github.com/unjs/unhead/pull/726), [**~~#733~~**](https://github.com/unjs/unhead/pull/733))

  The `**@unhead/addons**` package has been renamed to `**@unhead/bundler**` (the old name still works with a deprecation warning). Framework Vite plugins now use a **named** `**Unhead**` export and ship from each framework's `**/vite**` subpath:

  ```
  - import unhead from '@unhead/addons/vite'
  + import { Unhead } from '@unhead/vue/vite'
  // or @unhead/react/vite, @unhead/svelte/vite, @unhead/solid-js/vite

    export default defineConfig({
  -   plugins: [unhead()],
  +   plugins: [Unhead()],
    })
  ```

  ### Strict `**Link**` / `**Script**` / `**Meta**` types ([**~~#729~~**](https://github.com/unjs/unhead/pull/729))

  `**Link**` and `**Script**` unions no longer fall back to `**GenericLink**` / `**GenericScript**`, so the type system enforces per-tag constraints (e.g. `**preload + as: 'font'**` requires `**crossorigin**`). Meta `**content**` is now required; use `**content: null**` explicitly to remove a meta tag. Custom `**rel**` / `**type**` values need `**satisfies GenericLink**` / `**satisfies GenericScript**`. ### Dropped deprecations ([**~~#624~~**](https://github.com/unjs/unhead/pull/624)) | **Old** | **New** |
| --- | --- | | `**children**` | `**innerHTML**` | | `**hid**` / `**vmid**` | `**key**` | | `**body: true**` | `**tagPosition: 'bodyClose'**` | | `**useServerHead**` / `**useServerSeoMeta**` | `**useHead**` / `**useSeoMeta**` | | `**createHeadCore**` | `**createUnhead**` | | `**@unhead/vue/legacy**` | `**@unhead/vue/client**` or `**@unhead/vue/server**` (legacy path still works with deprecation warning) | | `**mode**` option on entries | Use client/server `**createHead**` imports | ### CJS removed ([**~~#482~~**](https://github.com/unjs/unhead/pull/482))

  All packages are ESM-only. ### Plugins now opt-in

  `**TemplateParamsPlugin**` and `**AliasSortingPlugin**` are no longer included by default. Import and register them explicitly if needed. ### Hooks removed
  - `**init**` hook removed
  - `**dom:renderTag**`, `**dom:rendered**` hooks deprecated (will be removed in v4)
  - `**dom:beforeRender**` is now synchronous (no async handlers) ### Type changes | **Removed** | **Replacement** |
| --- | --- | | `**Head**` | `**HeadTag**` | | `**MetaFlatInput**` | `**MetaFlat**` | | `**RuntimeMode**` | Removed | | `**@unhead/schema**` | `**unhead/types**` | | `**@unhead/shared**` | `**unhead**` | ### Schema.org
  - `**PluginSchemaOrg**` / `**SchemaOrgUnheadPlugin**` replaced with `**UnheadSchemaOrg**`
  - `**canonicalHost**` replaced with `**host**`, `**canonicalUrl**` replaced with `**host**` + `**path**`## 🔧 Migration Tooling

  Add `**ValidatePlugin**` during your upgrade to automatically detect v2 patterns:

  ```
  import { ValidatePlugin } from 'unhead/plugins'
  createHead({ plugins: [ValidatePlugin()] })
  ```

  It will warn about missing plugins, deprecated properties, and other common migration issues. Remove it once migration is complete. If you use the unified Vite plugin, `**ValidatePlugin**` is auto-injected in dev so you don't have to wire it up manually. See PRs [**~~#722~~**](https://github.com/unjs/unhead/pull/722), [**~~#733~~**](https://github.com/unjs/unhead/pull/733). ## 📖 Migration Guide

  See the full [**~~Migration Guide~~**](https://unhead.unjs.io/docs/head/guides/get-started/migration) for detailed upgrade instructions. ## Changelog ###    🚨 Breaking Changes
  - Drop deprecations  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/624~~**](https://github.com/unjs/unhead/issues/624) [`(229d3)`](https://github.com/unjs/unhead/commit/229d3959)
  - `**useHead()**` type narrowing  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/627~~**](https://github.com/unjs/unhead/issues/627) [`(e8086)`](https://github.com/unjs/unhead/commit/e8086a8a)
  - Sync `**renderDOMHead()**`  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/628~~**](https://github.com/unjs/unhead/issues/628) [`(627eb)`](https://github.com/unjs/unhead/commit/627eb054)
  - Sync `**renderSSRHead()**`  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/629~~**](https://github.com/unjs/unhead/issues/629) [`(44d71)`](https://github.com/unjs/unhead/commit/44d719d6)
  - Pluggable `**render()**` function  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/630~~**](https://github.com/unjs/unhead/issues/630) [`(baaa7)`](https://github.com/unjs/unhead/commit/baaa7738)
  - **bundler**:
    - Named Unhead export, ctx-based transforms, dev-mode validate  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/733~~**](https://github.com/unjs/unhead/issues/733) [`(3a607)`](https://github.com/unjs/unhead/commit/3a607513)
  - **types**:
    - Enforce strict type narrowing for Link and Script unions  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/729~~**](https://github.com/unjs/unhead/issues/729) [`(f846a)`](https://github.com/unjs/unhead/commit/f846a881)
  - **unhead**:
    - Sync resolve tag engine  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/619~~**](https://github.com/unjs/unhead/issues/619) [`(436a0)`](https://github.com/unjs/unhead/commit/436a09d7)
    - Composable `**resolveTags()**`  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/622~~**](https://github.com/unjs/unhead/issues/622) [`(b6a52)`](https://github.com/unjs/unhead/commit/b6a52e04) ###    🚀 Features
  - Streaming support  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/537~~**](https://github.com/unjs/unhead/issues/537) [`(bcfc4)`](https://github.com/unjs/unhead/commit/bcfc4565)
  - ValidatePlugin for head tag validation  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/690~~**](https://github.com/unjs/unhead/issues/690) [`(3fa0c)`](https://github.com/unjs/unhead/commit/3fa0cc54)
  - Access resolved head with `**onRendered**`  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/712~~**](https://github.com/unjs/unhead/issues/712) [`(55166)`](https://github.com/unjs/unhead/commit/55166ee6)
  - Add `**MinifyPlugin**` for inline script/style minification  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/705~~**](https://github.com/unjs/unhead/issues/705) [`(f1f5d)`](https://github.com/unjs/unhead/commit/f1f5d370)
  - V2 migration rules in ValidatePlugin + DOM hook deprecations  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/722~~**](https://github.com/unjs/unhead/issues/722) [`(f5edf)`](https://github.com/unjs/unhead/commit/f5edf077)
  - `**@unhead/bundler**` and `**/vite**` subpath exports  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/726~~**](https://github.com/unjs/unhead/issues/726) [`(df9c8)`](https://github.com/unjs/unhead/commit/df9c846f)
  - **canonical**:
    - Query param filtering, trailing slash & hash stripping  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/713~~**](https://github.com/unjs/unhead/issues/713) [`(8369d)`](https://github.com/unjs/unhead/commit/8369d8f7)
  - **devtools**:
    - Vite devtools integration  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/731~~**](https://github.com/unjs/unhead/issues/731) [`(e29d4)`](https://github.com/unjs/unhead/commit/e29d4357)
  - **react**:
    - Add @unhead/react/helmet compat export  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/719~~**](https://github.com/unjs/unhead/issues/719) [`(417da)`](https://github.com/unjs/unhead/commit/417dadcf)
  - **unhead**:
    - Add `**tagWeight**` option and `**meta-beyond-1mb**` validation rule  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/716~~**](https://github.com/unjs/unhead/issues/716) [`(c58be)`](https://github.com/unjs/unhead/commit/c58be621)
  - **validate**:
    - Add performance validation rules  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/691~~**](https://github.com/unjs/unhead/issues/691) [`(0abb6)`](https://github.com/unjs/unhead/commit/0abb6a74)
    - Add 7 performance/web vitals validation rules  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/725~~**](https://github.com/unjs/unhead/issues/725) [`(093a2)`](https://github.com/unjs/unhead/commit/093a2773)
  - **vue,streaming**:
    - Lower level stream APIs  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/674~~**](https://github.com/unjs/unhead/issues/674) [`(c67fb)`](https://github.com/unjs/unhead/commit/c67fb0a8) ###    🐞 Bug Fixes
  - Switch to `**HookableCore**`  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/631~~**](https://github.com/unjs/unhead/issues/631) [`(cc794)`](https://github.com/unjs/unhead/commit/cc794995)
  - Pure unhead core  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/632~~**](https://github.com/unjs/unhead/issues/632) [`(26937)`](https://github.com/unjs/unhead/commit/269378d0)
  - Hydration race condition with deferred patches  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/634~~**](https://github.com/unjs/unhead/issues/634) [`(3a36e)`](https://github.com/unjs/unhead/commit/3a36e771)
  - Sync `**transformHtmlTemplate**`  -  by @harlan-zw [`(f696d)`](https://github.com/unjs/unhead/commit/f696d9d4)
  - Stricter type narrowing for head schema  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/665~~**](https://github.com/unjs/unhead/issues/665) [`(0c857)`](https://github.com/unjs/unhead/commit/0c8573f6)
  - Type render() return across all framework integrations  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/672~~**](https://github.com/unjs/unhead/issues/672) [`(a7e76)`](https://github.com/unjs/unhead/commit/a7e761aa)
  - Cherry-pick fixes from main  -  by @harlan-zw [`(0a5f9)`](https://github.com/unjs/unhead/commit/0a5f9e3d)
  - Add `**fediverse:creator**` meta tag support  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/703~~**](https://github.com/unjs/unhead/issues/703) [`(545c9)`](https://github.com/unjs/unhead/commit/545c9de7)
  - Avoid mutating cached titleTemplate tag in resolveTitleTemplate  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/715~~**](https://github.com/unjs/unhead/issues/715) [`(977db)`](https://github.com/unjs/unhead/commit/977db362)
  - **addons**:
    - Respect user-provided twitter:card in InferSeoMetaPlugin  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/681~~**](https://github.com/unjs/unhead/issues/681) [`(77ace)`](https://github.com/unjs/unhead/commit/77ace215)
  - **client**:
    - Process pending patches even when dirty is false  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/530~~**](https://github.com/unjs/unhead/issues/530) and [**~~https://github.com/unjs/unhead/issues/636~~**](https://github.com/unjs/unhead/issues/636) [`(37db2)`](https://github.com/unjs/unhead/commit/37db290f)
  - **react**:
    - Ssr regression  -  by @harlan-zw [`(6adff)`](https://github.com/unjs/unhead/commit/6adff884)
  - **schema-org**:
    - Avoid crashing from 3+ duplicate nodes  -  by @harlan-zw [`(e68e6)`](https://github.com/unjs/unhead/commit/e68e662e)
    - Allow null to opt out of default values  -  by @harlan-zw and **harlan-zw** in [**~~https://github.com/unjs/unhead/issues/680~~**](https://github.com/unjs/unhead/issues/680) [`(01a7a)`](https://github.com/unjs/unhead/commit/01a7aaf8)
    - Clear graph nodes on each normalization cycle  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/701~~**](https://github.com/unjs/unhead/issues/701) [`(f665e)`](https://github.com/unjs/unhead/commit/f665e9e9)
    - Dedupe typed arrays by @type during node merge  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/702~~**](https://github.com/unjs/unhead/issues/702) [`(b2caf)`](https://github.com/unjs/unhead/commit/b2caf018)
    - Normalize `**target**` to array before merging potentialAction  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/709~~**](https://github.com/unjs/unhead/issues/709) [`(125ef)`](https://github.com/unjs/unhead/commit/125ef67e)
    - Add missing Vue exports for schemaAutoImports entries  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/728~~**](https://github.com/unjs/unhead/issues/728) [`(caf8c)`](https://github.com/unjs/unhead/commit/caf8ca31)
  - **types**:
    - Enforce required as attribute for preload links  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/683~~**](https://github.com/unjs/unhead/issues/683) [`(beeb5)`](https://github.com/unjs/unhead/commit/beeb5f18)
    - Make templateParams extensible via module augmentation  -  by @harlan-zw and **harlan-zw** in [**~~https://github.com/unjs/unhead/issues/679~~**](https://github.com/unjs/unhead/issues/679) [`(b0627)`](https://github.com/unjs/unhead/commit/b0627152)
  - **unhead**:
    - Avoid explicit vite dependency  -  by @harlan-zw [`(646a3)`](https://github.com/unjs/unhead/commit/646a3d09)
    - Deduplicate matching tags inside same render cycle  -  by @harlan-zw [`(1c258)`](https://github.com/unjs/unhead/commit/1c258334)
    - Broken `**book:release_date**` meta  -  by @harlan-zw [`(e413c)`](https://github.com/unjs/unhead/commit/e413c5c2)
  - **validate**:
    - False positives for warmup preloads and charset position  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/732~~**](https://github.com/unjs/unhead/issues/732) [`(9c839)`](https://github.com/unjs/unhead/commit/9c83934f)
  - **vue**:
    - Expose `**@unhead/vue/stream/iife**` with correct types  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/707~~**](https://github.com/unjs/unhead/issues/707) [`(a8f1a)`](https://github.com/unjs/unhead/commit/a8f1a17b)
    - Restore Style component inside Head and children prop  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/686~~**](https://github.com/unjs/unhead/issues/686) [`(f88c8)`](https://github.com/unjs/unhead/commit/f88c8464) ###    🏎 Performance
  - Migrate unplugins to oxc-walker  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/663~~**](https://github.com/unjs/unhead/issues/663) [`(35610)`](https://github.com/unjs/unhead/commit/35610ec9)
  - **client**: Reduce bundle size  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/635~~**](https://github.com/unjs/unhead/issues/635) [`(4c4a7)`](https://github.com/unjs/unhead/commit/4c4a72c3)
  - **unhead**: Client only capo sorting  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/626~~**](https://github.com/unjs/unhead/issues/626) [`(4bc60)`](https://github.com/unjs/unhead/commit/4bc604c3) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.5...v3.0.0) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v3.0.0)
- 4 months ago [<h3>v 2.1.**13**</h3>Release v2.1.13](https://github.com/unjs/unhead/releases/tag/v2.1.13) ###    🐞 Bug Fixes
  - **schema-org**: Normalize `**target**` to array before merging potentialAction  -  by @harlan-zw and **Claude Opus 4.6 (1M context)** in [**~~https://github.com/unjs/unhead/issues/709~~**](https://github.com/unjs/unhead/issues/709) [`(22ac9)`](https://github.com/unjs/unhead/commit/22ac9add) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.12...v2.1.13) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.13)
- 4 months ago [<h3>v 2.1.**12**</h3>Release v2.1.12](https://github.com/unjs/unhead/releases/tag/v2.1.12) ###    🐞 Bug Fixes
  - Harden prototype pollution  -  by @harlan-zw [`(a6ed9)`](https://github.com/unjs/unhead/commit/a6ed9f98)
  - Case insensitive attr dedupe  -  by @harlan-zw [`(3146b)`](https://github.com/unjs/unhead/commit/3146b90c) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.11...v2.1.12) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.12)
- 4 months ago [<h3>v 2.1.**11**</h3>Release v2.1.11](https://github.com/unjs/unhead/releases/tag/v2.1.11) ###     ⚠️ Security
  - Fixed XSS bypass in useHeadSafe via attribute name injection (GHSA-g5xx-pwrp-g3fv). Users handling untrusted input with useHeadSafe should upgrade immediately. ###    🐞 Bug Fixes
  - **addons,schema-org**: Permissive peer dependencies  -  by @harlan-zw [`(4c5d1)`](https://github.com/unjs/unhead/commit/4c5d1818) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.10...v2.1.11) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.11)
- 5 months ago [<h3>v 2.1.**10**</h3>Release v2.1.10](https://github.com/unjs/unhead/releases/tag/v2.1.10) ###    🐞 Bug Fixes
  - **solid-js**: Correct peerDependency version  -  by @tyeporter in [**~~https://github.com/unjs/unhead/issues/671~~**](https://github.com/unjs/unhead/issues/671) [`(64e17)`](https://github.com/unjs/unhead/commit/64e179a4) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.9...v2.1.10) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.10)
- 5 months ago [<h3>v 2.1.**9**</h3>Release v2.1.9](https://github.com/unjs/unhead/releases/tag/v2.1.9) ###    🐞 Bug Fixes
  - **schema-org**: Nuxt test utils compat bug  -  by @harlan-zw [`(ef838)`](https://github.com/unjs/unhead/commit/ef838412) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.8...v2.1.9) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.9)
- 5 months ago [<h3>v 2.1.**8**</h3>Release v2.1.8](https://github.com/unjs/unhead/releases/tag/v2.1.8) ###    🐞 Bug Fixes
  - **schema-org**: Avoid crashing from 3+ duplicate nodes  -  by @harlan-zw [`(4baf9)`](https://github.com/unjs/unhead/commit/4baf9d30) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.7...v2.1.8) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.8)
- 5 months ago [<h3>v 2.1.**7**</h3>Release v2.1.7](https://github.com/unjs/unhead/releases/tag/v2.1.7) ###    🐞 Bug Fixes
  - **unhead**:
    - deduplicate matching tags inside same render cycle  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/668~~**](https://github.com/unjs/unhead/issues/668) [`(5c0b2)`](https://github.com/unjs/unhead/commit/5c0b2930) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.6...v2.1.7) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.7)
- 5 months ago [<h3>v 2.1.**6**</h3>Release v2.1.6](https://github.com/unjs/unhead/releases/tag/v2.1.6) ###    🐞 Bug Fixes
  - **react**: Ssr regression  -  by @harlan-zw [`(6adff)`](https://github.com/unjs/unhead/commit/6adff884) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.5...v2.1.6) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.6)
- 5 months ago [<h3>v 2.1.**5**</h3>Release v2.1.5](https://github.com/unjs/unhead/releases/tag/v2.1.5) ###    🐞 Bug Fixes
  - **react**: Dispose head entries on unmount in React 18 StrictMode  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/664~~**](https://github.com/unjs/unhead/issues/664) [`(50ffe)`](https://github.com/unjs/unhead/commit/50ffe371)
  - **scripts**: Prevent scope disposal from aborting unrelated trigger in `**useScript**`  -  by @cernymatej in [**~~https://github.com/unjs/unhead/issues/660~~**](https://github.com/unjs/unhead/issues/660) [`(e8f5b)`](https://github.com/unjs/unhead/commit/e8f5b4b2)
  - **unhead**: Dedupe link rel without hreflang or type  -  by @danielroe in [**~~https://github.com/unjs/unhead/issues/658~~**](https://github.com/unjs/unhead/issues/658) [`(1487d)`](https://github.com/unjs/unhead/commit/1487db61) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.4...v2.1.5) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.5)
- 5 months ago [<h3>v 2.1.**4**</h3>Release v2.1.4](https://github.com/unjs/unhead/releases/tag/v2.1.4) ###    🐞 Bug Fixes
  - **schema-org**: Remove unimplemented SchemaOrgDebug  -  by @onmax in [**~~https://github.com/unjs/unhead/issues/649~~**](https://github.com/unjs/unhead/issues/649) [`(642dc)`](https://github.com/unjs/unhead/commit/642dc3e7)
  - **unhead**: Dedupe `**<link rel="alternate">**` by hreflang/type only, drop href from key  -  by @harlan-zw in [**~~https://github.com/unjs/unhead/issues/656~~**](https://github.com/unjs/unhead/issues/656) [`(86175)`](https://github.com/unjs/unhead/commit/86175ebc) #####      [**~~View changes on GitHub~~**](https://github.com/unjs/unhead/compare/v2.1.3...v2.1.4) [**View on GitHub **](https://github.com/unjs/unhead/releases/tag/v2.1.4)

Looking for older releases?

[**View all releases on GitHub **](https://github.com/unjs/unhead/releases)