--- navigation.icon: uil:file-search-alt description: Improve your Nuxt app's SEO with powerful head config, composables and components. --- # SEO and Meta Improve your Nuxt app's SEO with powerful head config, composables and components. ## App Head Providing an [app.head](/docs/api/configuration/nuxt-config#head) property in your `nuxt.config.ts` allows you to customize the head for your entire app. ::alert{type=info} This method does not allow you to provide reactive data, if you need global reactive data you can use `useHead` in `app.vue`. :: Shortcuts are available to make configuration easier: `charset` and `viewport`. You can also provide any of the keys listed below in [Types](#types). ### Defaults Out-of-the-box, Nuxt provides sane defaults, which you can override if needed. - `charset`: `utf-8` - `viewport`: `width=device-width, initial-scale=1` ### Example ```ts{}[nuxt.config.ts] export default defineNuxtConfig({ app: { head: { charset: 'utf-16', viewport: 'width=500, initial-scale=1', title: 'My App', meta: [ // { name: 'description', content: 'My amazing site.' } ], } } }) ``` :ReadMore{link="/docs/api/configuration/nuxt-config/#head"} ## Composable: `useHead` The `useHead` composable function allows you to manage your head tags in a programmatic and reactive way, powered by [@vueuse/head](https://github.com/vueuse/head). As with all composables, it can only be used with a components `setup` and lifecycle hooks. ### Example ```vue{}[app.vue] ``` ::ReadMore{link="/docs/api/composables/use-head"} :: ## Composable: `useSeoMeta` The `useSeoMeta` composable lets you define your site's SEO meta tags as a flat object with full TypeScript support. This helps you avoid typos and common mistakes, such as using `name` instead of `property`. ### Example #### Simple ```vue{}[app.vue] ``` #### Reactive When inserting tags that are reactive, for example, from an API request, you should use the computed getter syntax, the same as `useHead`. ```vue{}[app.vue] ``` ### Client-side Optimization In most instances, the meta does not need to be reactive as robots will only scan the initial load. The composable itself is ~2kB, so you may consider only using it on the server and having it be tree-shaken from the client bundle. ```vue{}[app.vue] ``` ::ReadMore{link="https://unhead.harlanzw.com/guide/guides/useseometa"} :: ## Components Nuxt provides `