---
title: "entries:normalize Hook · Unhead"
canonical_url: "https://unhead.unjs.io/docs/solid-js/head/api/hooks/entries-normalize"
last_updated: "2026-09-13T03:23:34.440Z"
meta:
  description: "Hook for changing the normalized tags produced by an individual head entry."
  "og:description": "Hook for changing the normalized tags produced by an individual head entry."
  "og:title": "entries:normalize Hook · Unhead"
---

Home

`
Unhead on GitHub

Switch to Solid.jsSwitch to TypeScriptSwitch to VueSwitch to ReactSwitch to SvelteSwitch to AngularSwitch to Nuxt

**Hooks**

# **entries:normalize Hook**

[Copy for LLMs](https://raw.githubusercontent.com/unjs/unhead/refs/heads/main/docs/head/7.api/hooks/04.entries-normalize.md)

The `**entries:normalize**` hook runs once for each uncached entry after its input has been normalized into tags. It runs before Unhead assigns internal weights and deduplication keys.

At the start of resolution, Unhead compares the combined number of `**entries:resolve**` and `**entries:normalize**` listeners with the previous resolution. If that count changed, it clears every entry's normalization cache. Uncached entries pass through this hook once, then remain cached until their input changes or a later listener-count change invalidates them.

## Hook Signature

```
export interface Hook {
  'entries:normalize': (ctx: {
    tags: HeadTag[]
    entry: HeadEntry<any>
  }) => SyncHookResult
}
```

### Parameters

| **Name** | **Type** | **Description** |
| --- | --- | --- |
| `**ctx.tags**` | `**HeadTag[]**` | Tags normalized from this entry |
| `**ctx.entry**` | `**HeadEntry<any>**` | The entry that produced the tags |

This hook is synchronous. You may mutate `**ctx.tags**` in place or replace it with another array.

## Usage Example

```
import { defineHeadPlugin } from '@unhead/solid-js/plugins'

export const descriptionPrefixPlugin = defineHeadPlugin({
  key: 'description-prefix',
  hooks: {
    'entries:normalize': ({ tags }) => {
      for (const tag of tags) {
        if (tag.tag === 'meta' && tag.props.name === 'description')
          tag.props.content = `Preview: ${tag.props.content}`
      }
    }
  }
})
```

`**HeadEntry**` fields whose names begin with `**_**` are internal. Avoid storing plugin state on them.

[Edit this page](https://github.com/unjs/unhead/edit/main/docs/head/7.api/hooks/04.entries-normalize.md)

[Markdown For LLMs](https://raw.githubusercontent.com/unjs/unhead/refs/heads/main/docs/head/7.api/hooks/04.entries-normalize.md)

**Did this page help you? **

[**entries:resolve** Hook for selecting or inspecting head entries before they are normalized into tags.](https://unhead.unjs.io/docs/head/api/hooks/entries-resolve) [**tag:normalise** Legacy hook type retained for compatibility but not called by the current tag resolver.](https://unhead.unjs.io/docs/head/api/hooks/tag-normalise)

**On this page **

- [Hook Signature](#hook-signature)
- [Usage Example](#usage-example)