Releases · Unhead

[Unhead Home](https://unhead.unjs.io/ "Home")

- [Docs](https://unhead.unjs.io/docs/typescript/head/guides/get-started/overview)
- [Tools](https://unhead.unjs.io/tools)
- [Learn](https://unhead.unjs.io/learn/guides/what-is-capo)

[Releases](https://unhead.unjs.io/releases)

Search…```k`` /`

[Unhead on GitHub](https://github.com/unjs/unhead)

## Release Notes

Last fetched: 17 hours ago.

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

Stable

Pre-releases

All

- 2 months ago [<h3>v 3.0.5 Latest release</h3>Release v3.0.5](https://github.com/unjs/unhead/releases/tag/v3.0.5) ### [   🐞 Bug Fixes](#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)
- 2 months ago [<h3>v 3.0.4</h3>Release v3.0.4](https://github.com/unjs/unhead/releases/tag/v3.0.4) ### [   🐞 Bug Fixes](#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)
- 2 months ago [<h3>v 3.0.3</h3>Release v3.0.3](https://github.com/unjs/unhead/releases/tag/v3.0.3) ### [   🐞 Bug Fixes](#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)
- 2 months ago [<h3>v 3.0.2</h3>Release v3.0.2](https://github.com/unjs/unhead/releases/tag/v3.0.2) ### [   🐞 Bug Fixes](#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)
- 2 months ago [<h3>v 3.0.1</h3>Release v3.0.1](https://github.com/unjs/unhead/releases/tag/v3.0.1) ### [   🐞 Bug Fixes](#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)
- 2 months ago [<h3>v3.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](#highlights) ### [🌊 Streaming SSR](#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](#️-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-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](#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](#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](#️-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](#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](#schemaorg)
  - **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](#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](#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](#️-breaking-changes) ### [Synchronous rendering](#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))](#build-plugins-unheadaddons-unheadbundler-726-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))](#strict-link-script-meta-types-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))](#dropped-deprecations-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))](#cjs-removed-482)

  All packages are ESM-only. ### [Plugins now opt-in](#plugins-now-opt-in)

  `TemplateParamsPlugin` and `AliasSortingPlugin` are no longer included by default. Import and register them explicitly if needed. ### [Hooks removed](#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](#type-changes) | Removed | Replacement |
| --- | --- | | `Head` | `HeadTag` | | `MetaFlatInput` | `MetaFlat` | | `RuntimeMode` | Removed | | `@unhead/schema` | `unhead/types` | | `@unhead/shared` | `unhead` | ### [Schema.org](#schemaorg)
  - `PluginSchemaOrg` / `SchemaOrgUnheadPlugin` replaced with `UnheadSchemaOrg`
  - `canonicalHost` replaced with `host`, `canonicalUrl` replaced with `host` + `path`## [🔧 Migration Tooling](#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](#migration-guide)

  See the full [Migration Guide](https://unhead.unjs.io/docs/head/guides/get-started/migration) for detailed upgrade instructions. ## [Changelog](#changelog) ### [   🚨 Breaking Changes](#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](#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](#bug-fixes-1)
  - 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](#performance-1)
  - 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)
- 2 months ago [<h3>v 2.1.13</h3>Release v2.1.13](https://github.com/unjs/unhead/releases/tag/v2.1.13) ### [   🐞 Bug Fixes](#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)
- 3 months ago [<h3>v 2.1.12</h3>Release v2.1.12](https://github.com/unjs/unhead/releases/tag/v2.1.12) ### [   🐞 Bug Fixes](#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)
- 3 months ago [<h3>v 2.1.11</h3>Release v2.1.11](https://github.com/unjs/unhead/releases/tag/v2.1.11) ### [    ⚠️ Security](#️-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](#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)
- 3 months ago [<h3>v 2.1.10</h3>Release v2.1.10](https://github.com/unjs/unhead/releases/tag/v2.1.10) ### [   🐞 Bug Fixes](#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)
- 3 months ago [<h3>v 2.1.9</h3>Release v2.1.9](https://github.com/unjs/unhead/releases/tag/v2.1.9) ### [   🐞 Bug Fixes](#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)
- 3 months ago [<h3>v 2.1.8</h3>Release v2.1.8](https://github.com/unjs/unhead/releases/tag/v2.1.8) ### [   🐞 Bug Fixes](#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)
- 3 months ago [<h3>v 2.1.7</h3>Release v2.1.7](https://github.com/unjs/unhead/releases/tag/v2.1.7) ### [   🐞 Bug Fixes](#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)
- 4 months ago [<h3>v 2.1.6</h3>Release v2.1.6](https://github.com/unjs/unhead/releases/tag/v2.1.6) ### [   🐞 Bug Fixes](#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)
- 4 months ago [<h3>v 2.1.5</h3>Release v2.1.5](https://github.com/unjs/unhead/releases/tag/v2.1.5) ### [   🐞 Bug Fixes](#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)
- 4 months ago [<h3>v 2.1.4</h3>Release v2.1.4](https://github.com/unjs/unhead/releases/tag/v2.1.4) ### [   🐞 Bug Fixes](#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)
- 4 months ago [<h3>v 2.1.3</h3>Release v2.1.3](https://github.com/unjs/unhead/releases/tag/v2.1.3) ### [   🐞 Bug Fixes](#bug-fixes)
  - **unhead**:
    - Dedupe `<link rel="alternate">`  -  by @danielroe and **onmax** in [https://github.com/unjs/unhead/issues/655](https://github.com/unjs/unhead/issues/655) [`(fdabe)`](https://github.com/unjs/unhead/commit/fdabe651)
  - **vue**:
    - Support computed getter trigger  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/638](https://github.com/unjs/unhead/issues/638) [`(fd63a)`](https://github.com/unjs/unhead/commit/fd63a285)
    - Guard `s._statusRef`  -  by @danielroe in [https://github.com/unjs/unhead/issues/642](https://github.com/unjs/unhead/issues/642) [`(4ef03)`](https://github.com/unjs/unhead/commit/4ef03ebf) ### [   🏎 Performance](#performance)
  - **vue**: Avoid duplicating error message in the bundle  -  by @panstromek in [https://github.com/unjs/unhead/issues/652](https://github.com/unjs/unhead/issues/652) [`(194e5)`](https://github.com/unjs/unhead/commit/194e561b) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.1.2...v2.1.3)
- 5 months ago [<h3>v 2.1.2</h3>Release v2.1.2](https://github.com/unjs/unhead/releases/tag/v2.1.2) ### [   🐞 Bug Fixes](#bug-fixes)
  - Broken cjs environment  -  by @harlan-zw [`(ce989)`](https://github.com/unjs/unhead/commit/ce989722) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.1.1...v2.1.2)
- 6 months ago [<h3>v 2.1.1</h3>Release v2.1.1](https://github.com/unjs/unhead/releases/tag/v2.1.1)

  _No significant changes_#####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.1.0...v2.1.1)
- 6 months ago [<h3>v 2.1.0</h3>Release v2.1.0](https://github.com/unjs/unhead/releases/tag/v2.1.0) ### [   🚀 Features](#features)
  - **schema-org**: 12 new nodes  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/612](https://github.com/unjs/unhead/issues/612) [`(1a9b8)`](https://github.com/unjs/unhead/commit/1a9b80a1) ### [   🐞 Bug Fixes](#bug-fixes)
  - **react**:
    - Recursive function resolves broken  -  by @harlan-zw [`(4e0c7)`](https://github.com/unjs/unhead/commit/4e0c719a)
  - **schema-org**:
    - Correct month off-by-one  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/603](https://github.com/unjs/unhead/issues/603) [`(a3e70)`](https://github.com/unjs/unhead/commit/a3e700a8)
    - Missing schema.org properties  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/614](https://github.com/unjs/unhead/issues/614) [`(54e05)`](https://github.com/unjs/unhead/commit/54e05522)
  - **unhead**:
    - Enforce boolean string meta contents  -  by @kfreezen in [https://github.com/unjs/unhead/issues/594](https://github.com/unjs/unhead/issues/594) [`(0b8e7)`](https://github.com/unjs/unhead/commit/0b8e71f1)
    - Capo module scripts ordering  -  by @Barbapapazes in [https://github.com/unjs/unhead/issues/600](https://github.com/unjs/unhead/issues/600) [`(3c661)`](https://github.com/unjs/unhead/commit/3c661921)
    - Capo inline scripts ordering  -  by @Barbapapazes in [https://github.com/unjs/unhead/issues/596](https://github.com/unjs/unhead/issues/596) [`(7be75)`](https://github.com/unjs/unhead/commit/7be752c8)
    - Normalize script type  -  by @harlan-zw [`(e51b6)`](https://github.com/unjs/unhead/commit/e51b6464)
    - Safer handling of input  -  by @harlan-zw [`(b4b6c)`](https://github.com/unjs/unhead/commit/b4b6c58d) ### [   🏎 Performance](#performance)
  - **schema-org**:
    - Remove ohash and defu dependencies  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/605](https://github.com/unjs/unhead/issues/605) [`(0d508)`](https://github.com/unjs/unhead/commit/0d50831a)
    - Rework graph resolution  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/616](https://github.com/unjs/unhead/issues/616) [`(b79e4)`](https://github.com/unjs/unhead/commit/b79e46d9) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.19...v2.1.0)
- 8 months ago [<h3>v 2.0.19</h3>Release v2.0.19](https://github.com/unjs/unhead/releases/tag/v2.0.19) ### [   🐞 Bug Fixes](#bug-fixes)
  - **vue**: Tree shaking breaking some reactivity  -  by @harlan-zw [`(7abb5)`](https://github.com/unjs/unhead/commit/7abb582e) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.18...v2.0.19)
- 8 months ago [<h3>v 2.0.18</h3>Release v2.0.18](https://github.com/unjs/unhead/releases/tag/v2.0.18) ### [   🏎 Performance](#performance)
  - **unhead**: Avoid server side effects  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/585](https://github.com/unjs/unhead/issues/585) [`(3fd09)`](https://github.com/unjs/unhead/commit/3fd0986d) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.17...v2.0.18)
- 9 months ago [<h3>v 2.0.17</h3>Release v2.0.17](https://github.com/unjs/unhead/releases/tag/v2.0.17)

  _No significant changes_#####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.16...v2.0.17)
- 9 months ago [<h3>v 2.0.16</h3>Release v2.0.16](https://github.com/unjs/unhead/releases/tag/v2.0.16)

  _No significant changes_#####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.15...v2.0.16)
- 9 months ago [<h3>v 2.0.15</h3>Release v2.0.15](https://github.com/unjs/unhead/releases/tag/v2.0.15) ### [   🐞 Bug Fixes](#bug-fixes)
  - NPM Trusted Publishing  -  by @harlan-zw [`(a5d9f)`](https://github.com/unjs/unhead/commit/a5d9fc8b)
  - **ssr**: Broken `extractUnheadInputFromHtml` regex  -  by @harlan-zw [`(e23db)`](https://github.com/unjs/unhead/commit/e23dbacd) ### [   🏎 Performance](#performance)
  - Walker based `transformHtmlTemplate`  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/581](https://github.com/unjs/unhead/issues/581) [`(37fc9)`](https://github.com/unjs/unhead/commit/37fc9257) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.14...v2.0.15)
- 10 months ago [<h3>v 2.0.14</h3>Release v2.0.14](https://github.com/unjs/unhead/releases/tag/v2.0.14) ### [   🐞 Bug Fixes](#bug-fixes)
  - **unhead**: Multiword attributes in template  -  by @NikSimonov in [https://github.com/unjs/unhead/issues/568](https://github.com/unjs/unhead/issues/568) [`(f635b)`](https://github.com/unjs/unhead/commit/f635b929) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.13...v2.0.14)
- 10 months ago [<h3>v 2.0.13</h3>Release v2.0.13](https://github.com/unjs/unhead/releases/tag/v2.0.13) ### [   🐞 Bug Fixes](#bug-fixes)
  - **unhead**:
    - Canonical plugin modifying non-url properties  -  by @paraboul [`(ee8fd)`](https://github.com/unjs/unhead/commit/ee8fd25b)
    - Avoid normalizing template param input  -  by @harlan-zw [`(1d205)`](https://github.com/unjs/unhead/commit/1d205d54)
    - Safer removal of leading / trailing separators  -  by @harlan-zw [`(d4501)`](https://github.com/unjs/unhead/commit/d450124a) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.12...v2.0.13)
- last year [<h3>v 2.0.12</h3>Release v2.0.12](https://github.com/unjs/unhead/releases/tag/v2.0.12) ### [   🐞 Bug Fixes](#bug-fixes)
  - **react**: Force invalidation on entry disposal  -  by @harlan-zw in [https://github.com/unjs/unhead/issues/559](https://github.com/unjs/unhead/issues/559) [`(4ee5e)`](https://github.com/unjs/unhead/commit/4ee5eac7) #####      [View changes on GitHub](https://github.com/unjs/unhead/compare/v2.0.11...v2.0.12)

Looking for older releases?

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

[GitHub](https://github.com/unjs/unhead) [ Discord](https://discord.com/invite/275MBUBvgP)

[ /llms.txt](https://unhead.unjs.io/llms.txt)

[Part of the UnJS ecosystem](https://unjs.io/)

### Head Management

- [Getting Started](https://unhead.unjs.io/docs/typescript/head/guides/get-started/overview)
- [useHead](https://unhead.unjs.io/docs/typescript/head/api/composables/use-head)
- [useSeoMeta](https://unhead.unjs.io/docs/typescript/head/api/composables/use-seo-meta)
- [useHeadSafe](https://unhead.unjs.io/docs/typescript/head/api/composables/use-head-safe)
- [useScript](https://unhead.unjs.io/docs/typescript/head/api/composables/use-script)

### Schema.org

- [Getting Started](https://unhead.unjs.io/docs/typescript/schema-org/guides/get-started/overview)
- [useSchemaOrg](https://unhead.unjs.io/docs/typescript/schema-org/api/composables/use-schema-org)
- [Nodes](https://unhead.unjs.io/docs/typescript/schema-org/guides/core-concepts/nodes)
- [Recipes](https://unhead.unjs.io/docs/typescript/schema-org/guides/recipes/identity)

### Guides

- [Titles](https://unhead.unjs.io/docs/typescript/head/guides/core-concepts/titles)
- [Streaming SSR](https://unhead.unjs.io/docs/typescript/head/guides/core-concepts/streaming)
- [DOM Events](https://unhead.unjs.io/docs/typescript/head/guides/core-concepts/dom-event-handling)
- [Plugins](https://unhead.unjs.io/docs/typescript/head/guides/plugins/template-params)

### Tools

- [Meta Tag Generator](https://unhead.unjs.io/tools/meta-tag-generator)
- [OG Image Generator](https://unhead.unjs.io/tools/og-image-generator)
- [Schema.org Generator](https://unhead.unjs.io/tools/schema-generator)
- [Capo.js Analyzer](https://unhead.unjs.io/tools/capo-analyzer)

### Articles

- [What is Capo.js?](https://unhead.unjs.io/learn/guides/what-is-capo)

### Research

- [State of <head> in 2026](https://unhead.unjs.io/learn/research/state-of-head-2026)
- [Streaming Head Performance](https://unhead.unjs.io/learn/research/streaming-head-performance)
- [Capo.js Performance Research](https://unhead.unjs.io/learn/research/capo-performance-research)

Copyright © 2025-2026 Harlan Wilton - [MIT License](https://github.com/unjs/unhead/blob/main/license)