# Nuxt Changelog

> Latest releases from Nuxt and official modules.

## v2.6.0 (nuxt/icon) - 2026-10-23

[Release notes](https://github.com/nuxt/icon/releases/tag/v2.6.0)

### &nbsp;&nbsp;&nbsp;🚀 Features

- `provider` can now be set separately for SSR and the browser: `provider: { server: 'server', client: 'iconify' }`. A string works as before. (#541)
- **Behavior change:** a relative `dir` in `customCollections` / `serverBundle.collections` declared in a Nuxt layer now resolves against that layer's directory instead of the app's `rootDir`. If a base layer declared a collection and expected each app to supply the SVGs, declare it in the app or use an absolute path. (#530)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- Allow `icons` query in cached handler for Nitro 3 &nbsp;-&nbsp; by @KazariAI and **Sebastien Chopin** in https://github.com/nuxt/icon/issues/542 [<samp>(01bfc)</samp>](https://github.com/nuxt/icon/commit/01bfc44)
- Resolve a custom collection `dir` from the layer that declared it &nbsp;-&nbsp; by @giaBaoJS and @atinux in https://github.com/nuxt/icon/issues/530 [<samp>(8f146)</samp>](https://github.com/nuxt/icon/commit/8f1466a)
- Don&#39;t append custom collection prefixes to the shared collection list &nbsp;-&nbsp; by @giaBaoJS and @atinux in https://github.com/nuxt/icon/issues/533 [<samp>(951c1)</samp>](https://github.com/nuxt/icon/commit/951c196)
- **bundle**: Include custom collection aliases in the client bundle &nbsp;-&nbsp; by @giaBaoJS and @atinux in https://github.com/nuxt/icon/issues/536 [<samp>(cc27c)</samp>](https://github.com/nuxt/icon/commit/cc27cce)
- **css**: Mount a late icon under the name it was requested for &nbsp;-&nbsp; by @atinux in https://github.com/nuxt/icon/issues/546 [<samp>(3eb56)</samp>](https://github.com/nuxt/icon/commit/3eb5685)
- **scan**: Don&#39;t extract icon names from the middle of identifiers &nbsp;-&nbsp; by @giaBaoJS in https://github.com/nuxt/icon/issues/531 [<samp>(729a5)</samp>](https://github.com/nuxt/icon/commit/729a575)
- **server**: Dedupe remote collection requests &nbsp;-&nbsp; by @onmax in https://github.com/nuxt/icon/issues/535 [<samp>(14d22)</samp>](https://github.com/nuxt/icon/commit/14d22b2)
- **test**: Update stale fixtures snapshot after solar icon set bump &nbsp;-&nbsp; by @antfubot in https://github.com/nuxt/icon/issues/532 [<samp>(b878f)</samp>](https://github.com/nuxt/icon/commit/b878f5b)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/icon/compare/v2.5.1...v2.6.0)

---

## v1.1.0 (nuxt/fonts) - 2026-10-22

[Release notes](https://github.com/nuxt/fonts/releases/tag/v1.1.0)

> v1.0.2 is the next patch release.

## 👉 Changelog

[compare changes](https://github.com/nuxt/fonts/compare/v1.0.1...v1.0.2)

### 🩹 Fixes

- merge dev route rule instead of replacing user rules (#950)
- register server variants for native nitro v3 support (#945)

### ❤️ Contributors

- Max (@onmax)
- Daniel Roe (@danielroe)

---

## v4.0.0-beta.7 (nuxt/devtools) - 2026-10-20

[Release notes](https://github.com/nuxt/devtools/releases/tag/v4.0.0-beta.7)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- **onboard**: Serve embedded.js through Nuxt&#39;s Vite dev handler &nbsp;-&nbsp; by @antfubot in https://github.com/nuxt/devtools/issues/1130 [<samp>(745fa)</samp>](https://github.com/nuxt/devtools/commit/745fa41c)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/devtools/compare/v4.0.0-beta.6...v4.0.0-beta.7)

---

## v4.0.0-beta.6 (nuxt/devtools) - 2026-10-20

[Release notes](https://github.com/nuxt/devtools/releases/tag/v4.0.0-beta.6)

### &nbsp;&nbsp;&nbsp;🚀 Features

- Upgrade to `@vitejs/devtools` v0.8 &nbsp;-&nbsp; by @antfu [<samp>(c13d0)</samp>](https://github.com/nuxt/devtools/commit/c13d00a6)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- **onboard**: Confirm installs in nuxi&#39;s terminal, on devframe v1.2.6 &nbsp;-&nbsp; by @antfubot in https://github.com/nuxt/devtools/issues/1126 [<samp>(c12b7)</samp>](https://github.com/nuxt/devtools/commit/c12b7219)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/devtools/compare/v4.0.0-beta.5...v4.0.0-beta.6)

---

## v2.2.0 (nuxt/image) - 2026-10-19

[Release notes](https://github.com/nuxt/image/releases/tag/v2.2.0)

> v2.2.0 is the next minor release.

## 👉 Changelog

[compare changes](https://github.com/nuxt/image/compare/v2.1.0...v2.2.0)

### 🚀 Enhancements

- **deps:** upgrade to released ipx v4 (#2352)
- support nuxt v5 (#2281)

### 🩹 Fixes

- use explicit imports in nitro v2 server runtime (#2347)
- **directus:** remove deprecated sharpen option (#2294)

### 🏡 Chore

- exempt first-party packages from pnpm minimumReleaseAge (#2306)

### ✅ Tests

- increase e2e provider test timeout to 60s (#2350)

### 🤖 CI

- only run `release` workflows in nuxt org (#2296)
- use `pnpm/setup` and `devEngines` (#2332)
- only fail fast in merge groups ([`de96294`](https://github.com/nuxt/image/commit/de96294))

### ❤️ Contributors

- Daniel Roe (@danielroe)
- Damian Głowala (@DamianGlowala)
- Luke Nelson (@luc122c)
- kheiner (@kheiner)

---

## v3.4.4 (nuxt/devtools) - 2026-10-19

[Release notes](https://github.com/nuxt/devtools/releases/tag/v3.4.4)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- **devtools**: Read vite configs from `vite:serverCreated` hook &nbsp;-&nbsp; by @danielroe in https://github.com/nuxt/devtools/issues/1123 [<samp>(36d10)</samp>](https://github.com/nuxt/devtools/commit/36d10a12)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/devtools/compare/v3.4.3...v3.4.4)

---

## v4.3.4 (nuxt/test-utils) - 2026-10-16

[Release notes](https://github.com/nuxt/test-utils/releases/tag/v4.3.4)

> v4.3.4 is the next patch release.

## 👉 Changelog

[compare changes](https://github.com/nuxt/test-utils/compare/v4.3.3...v4.3.4)

### 🩹 Fixes

- **runtime:** test failure when module cached (#1856)
- **runtime-utils:** support registerEndpoint with FormData in jsdom (#1846)
- **e2e:** restore test context before running `setup` hooks (#1855)
- **e2e:** apply `nuxtConfig` overrides to dev server (#1851)
- **config:** prefer `h3` version from nitro path (#1844)
- **module:** apply vitest setup only when loaded from vitest config (#1834)
- **config:** respect default resolve conditions in vitest browser mode (#1843)
- **module:** pass required token to open vitest ui in devtools (#1841)

### 💅 Refactors

- **module:** use `package-manager-detector` workspace + deno handling ([`1d59009c7`](https://github.com/nuxt/test-utils/commit/1d59009c7))

### 🏡 Chore

- cleanup example deps, unify vitest, and update knip config (#1840)

### ❤️ Contributors

- Yoshihiro Yamaguchi (@yamachi4416)
- Daniel Roe (@danielroe)

---

## v4.6.2 (nuxt/nuxt) - 2026-10-16

[Release notes](https://github.com/nuxt/nuxt/releases/tag/v4.6.2)

> v4.6.2 is the next patch release.

## 👉 Changelog

[compare changes](https://github.com/nuxt/nuxt/compare/v4.6.1...v4.6.2)

### 🩹 Fixes

- **nitro:** apply `useHeadSafe` rules to server island head ([`493565e99`](https://github.com/nuxt/nuxt/commit/493565e99))
- **nitro-server:** read router params from the path h3 matched ([`010f6b43d`](https://github.com/nuxt/nuxt/commit/010f6b43d))
- **nitro:** match server route rules case-insensitively unless routing is sensitive ([`f6cfee52c`](https://github.com/nuxt/nuxt/commit/f6cfee52c))
- **nuxt:** resolve rooted paths through the URL parser (#36617)
- **nuxt:** resolve empty route types in shared context (#36576)
- **nitro:** preserve server tsconfig with relocated build dir (#36494)
- **nuxt:** fix scroll offset for IDs starting with numbers (#36524)
- **kit:** do not exclude module directories with a dot in their name from app tsconfig (#36331)
- **nuxt:** detect vapor slots with `rawVaporSlotKey` from vue (#36614)
- **nuxt:** keep middleware layout when restoring deferred prerendered route (#36560)
- **schema:** provide default value for `experimental.typescriptPlugin` (#36561)
- **vite:** only replay compile error overlays to newly loaded pages (#36611)
- **nuxt:** re-export `AnyFetchPath` for emitted server route types (#36610)
- **vite:** warm up the dev ssr entry from a nitro plugin (#36615)
- **nitro:** avoid unused h3 imports in nuxt/server runtime (#36609)
- **vite-server:** scope asset url helpers to the build (#36591)
- **nuxt:** resolve `nuxt/app` to the app's runtime (#36587)
- **kit:** lowercase filename-derived handler method on nitro v2 (#36567)
- **nuxt,nitro:** normalise string/array `appMiddleware` (#36565)
- **nitro:** pass response headers to `render:response` listeners (#36583)
- **vite:** resolve inlined `vue` to its bundler build in dev (#36569)
- **nuxt:** don't start a page transition with no page to leave (#36535)
- **nuxt:** preserve error state on aborted or cancelled navigation (#36546)
- **vite,nitro:** link null-byte virtual css through `/@id/` in dev (#36549)
- **kit:** resolve module dependencies from the declaring module (#36542)
- **nitro:** only disable h3 + nitro presets when `nitroAutoImports` is off (#36548)
- **nitro,vite:** don't access unspecified dependencies (#36541)
- **nitro:** don't inline deps under absolute transpile dirs (#36540)
- **vite-server:** respect spa loading template location (#36536)

### 💅 Refactors

- **webpack,rspack:** inline friendly errors plugin (#36568)

### 📖 Documentation

- remove DeepWiki badge (#36616)
- rename `H(TTP)` to `HTTP` (#36559)
- mention `proxy` route rule ([`4a529be68`](https://github.com/nuxt/nuxt/commit/4a529be68))
- reference `definePlugin` and `defineNitroPlugin` in server plugin tip ([`64b8e0334`](https://github.com/nuxt/nuxt/commit/64b8e0334))
- open a PR to list a module ([`e551df267`](https://github.com/nuxt/nuxt/commit/e551df267))
- clarify testing environments, runners, and config (#32963)
- align spa loading template references (#36552)
- explain how to disable iOS Safari phone number detection (#36539)
- fix outdated internal links (#36550)
- explain how to restore nitro auto-imports with compat v5 ([`7499a445b`](https://github.com/nuxt/nuxt/commit/7499a445b))
- add spa-loading-template documentation (#36537)

### 🏡 Chore

- keep @nuxt/telemetry ignore for production mode 😭 ([`3110d6947`](https://github.com/nuxt/nuxt/commit/3110d6947))
- fix knip, eslint and type import failures in ci ([`fb01db4eb`](https://github.com/nuxt/nuxt/commit/fb01db4eb))
- exclude `nuxt/app` entry shim from root typecheck ([`c65cef3a8`](https://github.com/nuxt/nuxt/commit/c65cef3a8))
- animate readme banner (#36593)
- actually exclude fixtures from `test:engines` ([`6ce412822`](https://github.com/nuxt/nuxt/commit/6ce412822))
- resolve `#build/server-routes` stub via root tsconfig paths ([`8235dd605`](https://github.com/nuxt/nuxt/commit/8235dd605))

### ✅ Tests

- wait for scroll to settle in route-scroll e2e ([`ca784deb7`](https://github.com/nuxt/nuxt/commit/ca784deb7))

### 🤖 CI

- comment nuxt.com preview links on docs pull requests (#36594)
- regenerate kit `inlinedDependencies` in autofix ([`4b6da3a29`](https://github.com/nuxt/nuxt/commit/4b6da3a29))
- remove docs deploy triggers ([`917bdf218`](https://github.com/nuxt/nuxt/commit/917bdf218))

### 🎉 New Contributors

- Sandro Circi (@sandros94)
- Yunus Ozen (@ozenyunus35)
- Vladislav (@dsfcoll)
- AXH-xecoy (@axh-xecoy)
- Jess (@JessicaSachs)
- Gareth (@0xgdr)

### ❤️ Contributors

- Daniel Roe (@danielroe)
- Jonas Thelemann (@dargmuesli)
- Sandro Circi (@sandros94)
- Yunus Ozen (@ozenyunus35)
- Vladislav (@dsfcoll)
- Sébastien Chopin (@atinux)
- Kazbek Askarov (@kazbekaskarov)
- Nicholas (@Neekoras)
- Peter (@tada5hi)
- Baptiste Leproux (@larbish)
- Hugo (@HugoRCD)
- Harlan Wilton (@harlan-zw)
- AXH-xecoy (@axh-xecoy)
- Jess (@JessicaSachs)
- Alex Liu (@Mini-ghost)
- Gareth (@0xgdr)
- Florian Heuberger (@Flo0806)

---

## v4.12.0 (nuxt/ui) - 2026-10-15

[Release notes](https://github.com/nuxt/ui/releases/tag/v4.12.0)

## :sparkles: Highlights

### :bar_chart: Chart component

A new [`Chart`](https://ui.nuxt.com/docs/components/chart) component built on [TanStack Charts](https://tanstack.com/charts/latest) renders `line`, `area`, `bar` and `donut` charts as an SVG on the server. Series colors follow your theme and color mode through the new `--ui-chart-*` CSS variables:

```vue
<script setup lang="ts">
const data = [
  { month: 'January', desktop: 186, mobile: 80 },
  { month: 'February', desktop: 305, mobile: 200 },
  { month: 'March', desktop: 237, mobile: 120 }
]
</script>

<template>
  <UChart
    type="bar"
    :data="data"
    index="month"
    :categories="[{ key: 'desktop', label: 'Desktop' }, { key: 'mobile', label: 'Mobile' }]"
    stacked
  />
</template>
```

> [!NOTE]
> `@tanstack/charts` is an optional peer dependency, install it to use the component. When the props are not enough, the `definition` prop takes a full TanStack chart definition.

### :globe_with_meridians: Automatic locale with `@nuxtjs/i18n`

When `@nuxtjs/i18n` is installed, the [`App`](https://ui.nuxt.com/docs/components/app) component now follows the current i18n locale, and only the Nuxt UI locales matching your `i18n.locales` are bundled. You can drop the `import * as locales` pattern, which shipped every locale in the entry chunk:

```diff
- <script setup lang="ts">
- import * as locales from '@nuxt/ui/locale'
-
- const { locale } = useI18n()
- </script>
-
  <template>
-   <UApp :locale="locales[locale]">
+   <UApp>
      <NuxtPage />
    </UApp>
  </template>
```

> [!TIP]
> An explicit `locale` prop still wins, see the [i18n guide](https://ui.nuxt.com/docs/getting-started/integrations/i18n/nuxt#automatic-locale).

### :zap: Lighter and faster pages

Pages now load up to 27% less JavaScript. A page no longer loads the code of components only other pages use, and overlays are lazy loaded: the menu of `Header`, `Sidebar` and `DashboardSidebar`, the command palette of `DashboardSearch` and `ContentSearch`, and the toasts of `Toaster`.

| | v4.11.3 | v4.12.0 |
| --- | --: | --: |
| JS | 871.6 kB | 549.6 kB |
| JS (gzip) | 251.9 kB | 183.9 kB |

> [!NOTE]
> `UButton` also mounts about 38% faster and each item of an open `DropdownMenu` about 30% faster, since link props are now picked without a reactive proxy.

## :rocket: Features

* **App:** follow the `@nuxtjs/i18n` locale ([#7152](https://github.com/nuxt/ui/issues/7152)) ([43ba8a0](https://github.com/nuxt/ui/commit/43ba8a07ee6561613045c36c6e3015ceecf873c9))
* **Calendar:** add `yearsPerPage` prop ([#7138](https://github.com/nuxt/ui/issues/7138)) ([cc4acae](https://github.com/nuxt/ui/commit/cc4acae75c9e18705e97ff0b7af9b2dd5af3f290))
* **Chart:** new component ([#7022](https://github.com/nuxt/ui/issues/7022)) ([8b37286](https://github.com/nuxt/ui/commit/8b372869000484efbb9f687f9095782351ab2acf))
* **ChatReasoning:** add `autoOpen` prop ([#7049](https://github.com/nuxt/ui/issues/7049)) ([dad748e](https://github.com/nuxt/ui/commit/dad748e230314aed88fc555da93089185d49c1a3))
* **CheckboxGroup:** add `max` prop ([#7145](https://github.com/nuxt/ui/issues/7145)) ([63a0c05](https://github.com/nuxt/ui/commit/63a0c0563ea225d31d32019ccf3fdc9a455bb44c))
* **components:** add `loop` prop ([#7128](https://github.com/nuxt/ui/issues/7128)) ([a96f56f](https://github.com/nuxt/ui/commit/a96f56f7649b0794dba5337a4d483efeb228d58b))
* **components:** allow controlling heading element via `as` prop ([#7048](https://github.com/nuxt/ui/issues/7048)) ([623d6d2](https://github.com/nuxt/ui/commit/623d6d2bc35ad0d1e4afbc3dca039786aa3be240))
* **ContextMenu:** add `open` and `pressOpenDelay` props ([#7148](https://github.com/nuxt/ui/issues/7148)) ([73c489b](https://github.com/nuxt/ui/commit/73c489b64460430a0924e7897cfc33145e1458d0))
* **FileUpload:** add `reject` event for dropped files ([#7164](https://github.com/nuxt/ui/issues/7164)) ([c8f5ffc](https://github.com/nuxt/ui/commit/c8f5ffc69430a77da34e498337f8e93a6dced4a9))
* **FileUpload:** support custom file items in `v-model` ([#6927](https://github.com/nuxt/ui/issues/6927)) ([a352073](https://github.com/nuxt/ui/commit/a352073b458614937e489e5ec4770b00f75f4376))
* **InputMenu:** add default slot ([#6969](https://github.com/nuxt/ui/issues/6969)) ([3274113](https://github.com/nuxt/ui/commit/32741135b1ceafd1ca41ba4eef6684310608162a))
* **InputNumber:** add `startingValue` and `allowInvalid` props ([#7146](https://github.com/nuxt/ui/issues/7146)) ([d856ec3](https://github.com/nuxt/ui/commit/d856ec3d5f37bef9f9eab44dbf2396286ab26e25))
* **module:** export prose components from `@nuxt/ui/components/prose` ([#7143](https://github.com/nuxt/ui/issues/7143)) ([5c302c3](https://github.com/nuxt/ui/commit/5c302c3bb83661226b74008a17741e8e001b3925))
* **NavigationMenu:** add `viewport` prop ([#7123](https://github.com/nuxt/ui/issues/7123)) ([4a3464e](https://github.com/nuxt/ui/commit/4a3464e3619321cb44c3a017db12250a906ccac4))
* **ProsePrompt:** add `prompt` prop ([#7172](https://github.com/nuxt/ui/issues/7172)) ([8c92e5f](https://github.com/nuxt/ui/commit/8c92e5f9299c6c28ced1eebfd74e1d35805ac1c6))
* **Sidebar:** add `breakpoint` prop ([#7155](https://github.com/nuxt/ui/issues/7155)) ([2113daa](https://github.com/nuxt/ui/commit/2113daa41f2dfc13ffb2c37d9d1610002229c24b))
* **Toast:** add `closeOnClick` to actions ([#7147](https://github.com/nuxt/ui/issues/7147)) ([378873a](https://github.com/nuxt/ui/commit/378873a28d5db444c52873b21a71551609f11aa0))

## :bug: Bug Fixes

* **App:** forward `nonce` prop ([#7137](https://github.com/nuxt/ui/issues/7137)) ([9271533](https://github.com/nuxt/ui/commit/927153310901c0922a593336ef5f92cbb428761f))
* **Chart:** render tooltip above center slot ([5cf6b3a](https://github.com/nuxt/ui/commit/5cf6b3a9dfba74c6280190156ae43eba2af644ce))
* **ChatMessages/ChatPromptSubmit:** add accessible names to icon buttons ([#7153](https://github.com/nuxt/ui/issues/7153)) ([3cd30e0](https://github.com/nuxt/ui/commit/3cd30e013affa172acc2048710109690d83b042c))
* **ColorModeButton:** resolve label after mount ([#7167](https://github.com/nuxt/ui/issues/7167)) ([9a12b1f](https://github.com/nuxt/ui/commit/9a12b1fbcef56286c4b824fecd0c7a50dee6e53b))
* **components:** localize hardcoded accessibility labels ([#7177](https://github.com/nuxt/ui/issues/7177)) ([fc7137c](https://github.com/nuxt/ui/commit/fc7137cd47d37d4b7af52b7d9dffa63be51d45e8))
* **components:** prevent empty trailing slot when loading ([#7027](https://github.com/nuxt/ui/issues/7027)) ([1f46ce1](https://github.com/nuxt/ui/commit/1f46ce11fa0ead45de6c4d3bf2a3761c9d7188e9))
* **components:** spin trailing loading icon with avatar ([#7168](https://github.com/nuxt/ui/issues/7168)) ([2fc9ba0](https://github.com/nuxt/ui/commit/2fc9ba0cb8edae7cbc804a7ae6477361ef20defa))
* **ContentSearch/DashboardSearch:** handle `undefined` selection when an item is toggled off ([#7170](https://github.com/nuxt/ui/issues/7170)) ([14f13af](https://github.com/nuxt/ui/commit/14f13af6b8e1e58bb239ce03eb51adbbbcef37a6))
* **ContentToc:** raise list min height ([#7113](https://github.com/nuxt/ui/issues/7113)) ([2b535b0](https://github.com/nuxt/ui/commit/2b535b0187d8755233748c5835733b13152709ac))
* **Drawer:** don't disable body pointer events with `noBodyStyles` ([#7150](https://github.com/nuxt/ui/issues/7150)) ([04f253e](https://github.com/nuxt/ui/commit/04f253edb99d24993eb74bb83ca5418a77b24997))
* **Drawer:** emit `after:leave` and `after:enter` when the animation ends ([#7107](https://github.com/nuxt/ui/issues/7107)) ([5cd317b](https://github.com/nuxt/ui/commit/5cd317bfee044346ac3d3005b1348ff5b5f0d2d9))
* **Editor:** align link styles with prose ([f943f20](https://github.com/nuxt/ui/commit/f943f2059f2eea1dcf3fc9d992f5269103d7a096))
* **FileUpload:** make the `dropzone` prop reactive ([#7055](https://github.com/nuxt/ui/issues/7055)) ([f4322e7](https://github.com/nuxt/ui/commit/f4322e7a3577939f43be0781170a4827af15122c))
* **Form:** accept empty values in `state` type ([#7165](https://github.com/nuxt/ui/issues/7165)) ([a59a3a3](https://github.com/nuxt/ui/commit/a59a3a3e00cc95f03f596d80013b05fb3abc63c1))
* **Kbd:** avoid hydration mismatch for platform-specific keys ([#7166](https://github.com/nuxt/ui/issues/7166)) ([78e72fb](https://github.com/nuxt/ui/commit/78e72fb9b7a1012146f6713bba850f8024cbd8d5))
* **Link:** promote queued prefetch on interaction ([#7124](https://github.com/nuxt/ui/issues/7124)) ([974cc0d](https://github.com/nuxt/ui/commit/974cc0d9fa22a45e450e3171c3d9024275c4ec75))
* **Listbox:** add accessible name to listbox ([#7193](https://github.com/nuxt/ui/issues/7193)) ([6bbb358](https://github.com/nuxt/ui/commit/6bbb358e1749a54d5d06df7397b7e78394756626))
* **Pagination:** localize `aria-label` of controls and pages ([#7151](https://github.com/nuxt/ui/issues/7151)) ([d2d3da0](https://github.com/nuxt/ui/commit/d2d3da0db012b8a21a003eace1b81f00e4135f32))
* **ProseA:** hide underline on focus and around inline code ([3cd61ed](https://github.com/nuxt/ui/commit/3cd61edc6d051501ee2393513b987ab44953821b))
* **SelectMenu:** keep controls outside the listbox ([#7096](https://github.com/nuxt/ui/issues/7096)) ([ded6848](https://github.com/nuxt/ui/commit/ded6848ef6bd06e724d28d425df12204b06f8328))
* **SelectMenu:** keep menu open when focus moves outside ([#7095](https://github.com/nuxt/ui/issues/7095)) ([26016e8](https://github.com/nuxt/ui/commit/26016e8d4242426c3f1085a20eb7c33f55f92360))
* **Slideover:** only cap width from `sm` breakpoint ([#7156](https://github.com/nuxt/ui/issues/7156)) ([608a3d3](https://github.com/nuxt/ui/commit/608a3d3c93feef128d82d2cfcb2a2afc60aab982))
* **Table:** measure virtualized rows with variable heights ([#7204](https://github.com/nuxt/ui/issues/7204)) ([0e487d6](https://github.com/nuxt/ui/commit/0e487d62d5cc3149e2f7ed8eb0e2520981fd6a89))
* **Table:** respect `defaultColumn` cell and header ([#7198](https://github.com/nuxt/ui/issues/7198)) ([da9125c](https://github.com/nuxt/ui/commit/da9125cabe1d7e3814cde33c4af8d8b3a8bdb8bb))
* **theme:** remove unknown and conflicting classes ([96d0a50](https://github.com/nuxt/ui/commit/96d0a50c7df17efe111fc9fc7198a31ff47a8cfc))
* **Tree:** pass `disabled` to tree item ([#7139](https://github.com/nuxt/ui/issues/7139)) ([db30f7f](https://github.com/nuxt/ui/commit/db30f7f4402e80e94b7325f0a16bca1f554a6229))
* **useToast:** skip pulse while toast is animating ([#7195](https://github.com/nuxt/ui/issues/7195)) ([e51d3a9](https://github.com/nuxt/ui/commit/e51d3a9491e7f70e8f19ecda373bdc813ea8c65a))
* **useTour:** accept any CSS selector as step target ([#7144](https://github.com/nuxt/ui/issues/7144)) ([8a7270d](https://github.com/nuxt/ui/commit/8a7270d6604b5f7fd4ab07d52a57bd47736480d0))

## :fire: Performances

* **components:** import Reka UI primitives by name instead of from `reka-ui/namespaced` ([#7176](https://github.com/nuxt/ui/issues/7176)) ([896d609](https://github.com/nuxt/ui/commit/896d60962266a62012bc89bb53a8e65e863b2921))
* **components:** pick link props without a reactive proxy ([#7208](https://github.com/nuxt/ui/issues/7208)) ([68d0467](https://github.com/nuxt/ui/commit/68d0467eff78a3bb4d4fda2dddf8d938577b28c4))
* **DashboardSearch/ContentSearch:** lazy load modal and command palette ([#7161](https://github.com/nuxt/ui/issues/7161)) ([6f50933](https://github.com/nuxt/ui/commit/6f50933451bfa1150a303378682f5282c04820d7))
* **Header/DashboardSidebar/Sidebar:** lazy load menu overlay ([#7160](https://github.com/nuxt/ui/issues/7160)) ([691899a](https://github.com/nuxt/ui/commit/691899a81fdfce05c8218f4924fcf9c32e329a1a))
* **Toaster:** lazy load toast component ([#7163](https://github.com/nuxt/ui/issues/7163)) ([1b09a26](https://github.com/nuxt/ui/commit/1b09a2678353c53107831998b9610e8898fe2ed9))
* **useComponentProps:** skip prop resolution for Vue internal flags ([#7186](https://github.com/nuxt/ui/issues/7186)) ([c029710](https://github.com/nuxt/ui/commit/c029710988bc6f472e74e1d3db92d0e5fcdfef6e))

## :green_heart: Contributors

* @benjamincanac
* @kazbekaskarov
* @danielroe
* @61021
* @cristianchiriac
* @derblub
* @devotee101
* @giaBaoJS
* @leo-2-ga-ha
* @MFA-G
* @minwookshin
* @rdjanuar
* @ttcchhmm
* @vachmara

**Full Changelog**: https://github.com/nuxt/ui/compare/v4.11.3...v4.12.0


---

## v3.4.3 (nuxt/devtools) - 2026-10-14

[Release notes](https://github.com/nuxt/devtools/releases/tag/v3.4.3)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- **devtools**: Require the dev auth token for server config and storage mounts &nbsp;-&nbsp; by @antfubot in https://github.com/nuxt/devtools/issues/1124 [<samp>(0383c)</samp>](https://github.com/nuxt/devtools/commit/0383cd75)

### &nbsp;&nbsp;&nbsp;🏎 Performance

- Replace `nypm` with `package-manager-detector` &nbsp;-&nbsp; by @danielroe in https://github.com/nuxt/devtools/issues/1102 [<samp>(21904)</samp>](https://github.com/nuxt/devtools/commit/21904b9b)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/devtools/compare/v3.4.2...v3.4.3)

---

## v4.0.0-beta.5 (nuxt/devtools) - 2026-10-13

[Release notes](https://github.com/nuxt/devtools/releases/tag/v4.0.0-beta.5)

### &nbsp;&nbsp;&nbsp;🚨 Breaking Changes

- **devtools**: Slim the install size of @nuxt/devtools &nbsp;-&nbsp; by @antfubot in https://github.com/nuxt/devtools/issues/1121 [<samp>(10f9e)</samp>](https://github.com/nuxt/devtools/commit/10f9ee88)

### &nbsp;&nbsp;&nbsp;🚀 Features

- Remove Open Graph module and integrate new assets and Open Graph plugins &nbsp;-&nbsp; by @antfu [<samp>(b4d46)</samp>](https://github.com/nuxt/devtools/commit/b4d46d3c)
- Deps on `@nuxt/devtools-assets` for now to improve the landing experience (as we have the onboard package now) &nbsp;-&nbsp; by @antfu [<samp>(93820)</samp>](https://github.com/nuxt/devtools/commit/9382024a)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- **onboard**: Load DevTools v3, v4 and nightly releases &nbsp;-&nbsp; by @antfubot in https://github.com/nuxt/devtools/issues/1122 [<samp>(d0b77)</samp>](https://github.com/nuxt/devtools/commit/d0b77e80)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/devtools/compare/v4.0.0-beta.4...v4.0.0-beta.5)

---

## v2.0.0-beta.16 (nuxt/scripts) - 2026-10-12

[Release notes](https://github.com/nuxt/scripts/releases/tag/v2.0.0-beta.16)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- **ci**: Skip stale workflow results and quote headers &nbsp;-&nbsp; by @harlan-zw in https://github.com/nuxt/scripts/issues/960 [<samp>(f8ebc)</samp>](https://github.com/nuxt/scripts/commit/f8ebc7c5)
- **cloudflare**: Keep analytics collection in the browser &nbsp;-&nbsp; by @harlan-zw in https://github.com/nuxt/scripts/issues/957 [<samp>(b1319)</samp>](https://github.com/nuxt/scripts/commit/b1319301)
- **scripts**: Preserve consent when reusing script consumers &nbsp;-&nbsp; by @harlan-zw in https://github.com/nuxt/scripts/issues/961 [<samp>(e2100)</samp>](https://github.com/nuxt/scripts/commit/e2100bb4)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/scripts/compare/v2.0.0-beta.15...v2.0.0-beta.16)

---

## v3.16.2 (nuxt/content) - 2026-10-12

[Release notes](https://github.com/nuxt/content/releases/tag/v3.16.2)

### 🐞 Bug Fixes

- Continue when package manager exits non-zero after installing - by @0xgdr in https://github.com/nuxt/content/issues/3871 [<samp>(ebfdc)</samp>](https://github.com/nuxt/content/commit/ebfdc2c9)
- **api**:
  - Don&#39;t forward body headers to internal content requests - by @devtechedge in https://github.com/nuxt/content/issues/3868 [<samp>(ffa5a)</samp>](https://github.com/nuxt/content/commit/ffa5ac39)
- **cache**:
  - Await development cache replacement - by @onmax in https://github.com/nuxt/content/issues/3846 [<samp>(75eff)</samp>](https://github.com/nuxt/content/commit/75eff79a)
- **search**:
  - Preserve word boundaries between block elements - by @maricastroc and @farnabaz in https://github.com/nuxt/content/issues/3861 [<samp>(05a30)</samp>](https://github.com/nuxt/content/commit/05a3074e)
- **security**:
  - Standard quotes and block IN operator validate - by @farnabaz in https://github.com/nuxt/content/issues/3862 [<samp>(006d1)</samp>](https://github.com/nuxt/content/commit/006d1382)
  - Accept only query-builder WHERE clauses - by @farnabaz in https://github.com/nuxt/content/issues/3877 [<samp>(9fae8)</samp>](https://github.com/nuxt/content/commit/9fae87e7)

### 🏎 Performance

- **cache**: Avoid repeated cache index copies - by @onmax in https://github.com/nuxt/content/issues/3847 [<samp>(464fb)</samp>](https://github.com/nuxt/content/commit/464fb167)
- **navigation**: Skip unused leaf sibling searches - by @onmax and @farnabaz in https://github.com/nuxt/content/issues/3845 [<samp>(6fc1e)</samp>](https://github.com/nuxt/content/commit/6fc1e262)

##### [View changes on GitHub](https://github.com/nuxt/content/compare/v3.16.1...v3.16.2)

---

## v2.0.0-beta.15 (nuxt/scripts) - 2026-10-12

[Release notes](https://github.com/nuxt/scripts/releases/tag/v2.0.0-beta.15)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- **devtools**: Add repository metadata for npm publishing &nbsp;-&nbsp; by @harlan-zw in https://github.com/nuxt/scripts/issues/954 [<samp>(1f1a9)</samp>](https://github.com/nuxt/scripts/commit/1f1a9ebb)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/scripts/compare/v2.0.0-beta.14...v2.0.0-beta.15)

---

## v1.1.5 (nuxt/hints) - 2026-10-11

[Release notes](https://github.com/nuxt/hints/releases/tag/v1.1.5)

### 🩹 Fixes

- **html-validate:** Wrap validation in a try/catch ([#377](https://github.com/nuxt/hints/pull/377))
- Support app baseURL ([#392](https://github.com/nuxt/hints/pull/392))
- **lazy-load:** Wrap imported components inside setup to support circular imports ([#393](https://github.com/nuxt/hints/pull/393))

### ❤️ Contributors

- Julien Huang ([@huang-julien](https://github.com/huang-julien))



---

## v1.0.1 (nuxt/fonts) - 2026-10-11

[Release notes](https://github.com/nuxt/fonts/releases/tag/v1.0.1)

> v1.0.1 is the next patch release.

## 👉 Changelog

[compare changes](https://github.com/nuxt/fonts/compare/v1.0.0...v1.0.1)

### 📦 Build

- prepare before prepack step ([`e2777f9`](https://github.com/nuxt/fonts/commit/e2777f9))

### ❤️ Contributors

- Daniel Roe (@danielroe)

---

## v1.0.0 (nuxt/fonts) - 2026-10-11

[Release notes](https://github.com/nuxt/fonts/releases/tag/v1.0.0)

> v1.0.0 is the first stable release of Nuxt Fonts.

Nuxt Fonts has been in production use for over a year, and the underlying stack it is built on has now stabilised: [`unifont`](https://unifont.dev), [`fontaine`](https://github.com/unjs/fontaine) and [`fontless`](https://github.com/nuxt/fontless) all reached v1 alongside this release.

- `unifont` resolves font metadata from providers
- `fontaine` uses that metadata to cut layout shift
- `fontless` does the whole thing in Vite with zero config

… and of course, `@nuxt/fonts` wraps all three and wires them into Nuxt.

Most projects should be able to upgrade simply by bumping the version, but read on for full details...!

## 🚨 Breaking (or significant) changes

### Font metadata is cached per project

Font metadata and downloaded font files are now cached in `node_modules/.cache/nuxt/fonts/meta` relative to your project root rather than to the directory you run Nuxt from. The first build after upgrading will re-resolve and re-download fonts.

You can now configure the location with the [`cache`](https://fonts.nuxt.com/get-started/configuration#cache) option, pass your own [unstorage](https://unstorage.unjs.io/) instance, or disable persistent caching with `cache: false`.

```ts
export default defineNuxtConfig({
  fonts: {
    cache: '.cache/fonts',
  },
})
```

### Font failures fail production builds

[`throwOnError`](https://fonts.nuxt.com/get-started/configuration#throwonerror) now defaults to `true` outside of dev mode. Rather than producing a build with a missing font, the build fails when a provider errors, when a font file cannot be downloaded after retries, or when you set `provider` on a family and that provider does not contain it.

A family that cannot be found by any provider still warns rather than failing, as does an unknown provider name, so fonts you declare yourself in CSS are unaffected.

```ts
export default defineNuxtConfig({
  fonts: {
    throwOnError: false,
  },
})
```

### Family-level `@font-face` descriptors now apply to provider fonts

`display` and `unicodeRange` set on a family were previously only honoured for families you declared manually with `src`, and were silently dropped for fonts resolved from a provider. They now apply in both cases. Descriptors other than `display`, `weight` and `style` (such as `stretch`, `featureSettings` and `variationSettings`) are also no longer dropped from manually declared families.

If you set any of these options on a family and relied on them being ignored, your generated CSS will change. Setting `unicodeRange` on a family marks it as subsetted, so it is no longer preloaded by default; set [`preload`](https://fonts.nuxt.com/get-started/configuration#preload) explicitly if you still want a preload link for it.

### Injected `@font-face` rules are minified with `lightningcss`

Generated `@font-face` declarations were previously minified with esbuild unless you had opted into `css.lightningcss`. They are now always minified with lightningcss, so the exact serialisation of the CSS we inject may differ (for example `local(Font Name)` rather than `local("Font Name")`). This is cosmetic, but it will show up in snapshot tests.

### The default `400 700` weight range is applied

`weights` has always been documented as defaulting to `['400 700']`, but the default was set on the wrong option and never reached the resolver, so families without an explicit `weights` resolved at weight `400` alone. The documented default now takes effect ([#619](https://github.com/nuxt/fonts/issues/619)).

A family you didn't set `weights` on will resolve a bold face as well as a regular one, so expect additional `@font-face` rules and an additional file downloaded per family. Text that silently fell back to a synthesised bold will now render in the real one.

```ts
export default defineNuxtConfig({
  fonts: {
    defaults: {
      weights: [400],
    },
  },
})
```

### Fonts are served from `/_nuxt/fonts` in Vite builds

Production builds with the Vite builder now emit font files as Vite build assets under `app.buildAssetsDir`, so they are served from `/_nuxt/fonts/<hash>.woff2` rather than `/_fonts/<hash>.woff2`. Vite owns their URLs, which means `app.cdnURL`, a relative `app.baseURL` and `experimental.renderBuiltUrl` all now apply to fonts as they do to every other built asset.

The location of a font file is an implementation detail rather than a stable URL contract. If you have hard-coded `/_fonts/` anywhere (a CDN rule, a CSP directive, a cache header, a test), point it at your build assets directory instead. Fonts are still served from `/_fonts` in development and with the webpack and rspack builders.

### `app.cdnURL` now applies to fonts

This follows from the change above. `cdnURL` was previously never applied to font URLs, so fonts were always served same-origin. They now come from your CDN.

> [!IMPORTANT]
> Browsers always fetch fonts in CORS mode, so the CDN must respond with an `Access-Control-Allow-Origin` header that covers your site. Without it, fonts that previously loaded fail silently and the browser falls back to the next family in the stack. If you set `cdnURL` and don't control the headers on it, check this before upgrading.

### `assets.prefix` is relative to `buildAssetsDir` in Vite builds

`assets.prefix` now names a directory inside `app.buildAssetsDir` in Vite production builds, and defaults to `fonts`. Setting `prefix: '/my-fonts'` serves fonts from `/_nuxt/my-fonts` rather than from `/my-fonts`. It remains a public path in development and with the webpack and rspack builders.

### `global: true` families get font fallback metrics

`global` is the escape hatch for fonts we can't detect from your CSS, but until now that meant the fonts most likely to cause layout shift were the ones we did least about: the `@font-face` went into a global stylesheet and no fallback metric overrides were generated at all.

We now generate those overrides at every usage site we can see, so `font-family: 'Anton'` in a component becomes `font-family: 'Anton', 'Anton Fallback: Arial', ...` with the matching `size-adjust` and `ascent-override` rules alongside it, exactly as it would for a family that wasn't declared globally. The `@font-face` rule itself still comes from the global stylesheet and isn't duplicated, and preload hints are unchanged. Usage we can't scan (an SVG, a family chosen at runtime) keeps working as before.

Set `fallbacks: []` on the family if you don't want the fallback rules.

### The `local` provider only scans layer `public/` directories

The [`local` provider](https://fonts.nuxt.com/get-started/providers#local) previously scanned every directory in `nitro.publicAssets`, including those that modules register for their own files. It now scans only the `public/` directory of your project and of each layer.

If you relied on fonts in another `nitro.publicAssets` directory, add it to [`local.dirs`](https://fonts.nuxt.com/get-started/providers#fonts-installed-from-npm):

```ts
export default defineNuxtConfig({
  fonts: {
    local: {
      dirs: ['../some-module/fonts'],
    },
  },
})
```

## ⚠️ Deprecations

### `experimental.processCSSVariables`

`fonts.experimental.processCSSVariables` has moved to `fonts.processCSSVariables`. The old location still works and now warns.

```ts
export default defineNuxtConfig({
  fonts: {
    processCSSVariables: true,
  },
})
```

### `fonts:public-asset-context`

Use [`fonts:resolved`](https://fonts.nuxt.com/advanced#fontsresolved) instead. It reports each family as it is resolved, with the URL every font file is served from and a `readFont()` to read its contents, so there's no need to reconstruct paths from the asset context. (The old hook still works.)

## ✨ Features

### A new DevTools panel

The Fonts panel in [Nuxt DevTools](https://devtools.nuxt.com) has been rebuilt on `fontless`. It lists every family resolved for your app, the provider that served it, the faces generated for it, where each one is used, and any warnings raised while resolving it.

https://github.com/user-attachments/assets/287f08a8-f92e-4a3d-a585-ab4ea80432db

### webpack and rspack support

Nuxt Fonts now works with the webpack and rspack builders. Previously our CSS transform ran after `css-loader` had already turned stylesheets into JavaScript modules, so no `@font-face` rule was ever injected, and a family declared with `global: true` failed the client build outright.

The transform now runs immediately before `css-loader`, which means it sees your styles after Sass and PostCSS have run, so a family named only through a preprocessor variable is detected too. There's nothing to change on your side, but a build that silently shipped no web fonts will now download them and serve them from `/_fonts`.

### Arbitrary variable axes

Variable font axes beyond `wght` now resolve from providers that publish them, so you can ask for `wdth`, `slnt`, `opsz` and more.

```ts
export default defineNuxtConfig({
  fonts: {
    families: [
      {
        name: 'Roboto Flex',
        provider: 'google',
        providerOptions: {
          google: {
            experimental: {
              variableAxis: { wdth: [['75', '100']] },
            },
          },
        },
      },
    ],
  },
})
```

### Subsetting fonts to the glyphs you use

The new `glyphs` option reduces every font file we emit to the characters needed to render the text you give it, which can dramatically cut the bytes shipped for icon fonts and single-language sites.

```ts
export default defineNuxtConfig({
  fonts: {
    defaults: {
      glyphs: 'Handgloves & 0123',
    },
  },
})
```

Where a provider can subset server-side the characters are passed through to it, so the full file is never downloaded. Every other file is subsetted after download, which needs the [`subset-font`](https://github.com/papandreou/subset-font) package; we'll offer to install it the first time you run Nuxt with `glyphs` set.

> [!IMPORTANT]
> Before enabling subsetting, make sure the font licence allows you to do so. Many do not.

### Preloading by subset

[`preload`](https://fonts.nuxt.com/get-started/configuration#preload) (on `defaults` and on individual `families`) accepts `{ subsets: [...] }` or a filter function, so you can preload just the subsets your app needs.

```ts
export default defineNuxtConfig({
  fonts: {
    defaults: {
      preload: { subsets: ['latin'] },
    },
  },
})
```

### Named font weights

`weights` accepts CSS keywords (`normal`, `bold`, `light`, ...) in config, and the `local` provider recognises them in filenames, so `MyFont-Bold.woff2` is picked up as weight `700`.

### Scanning additional local font directories

The `local` provider can scan directories beyond `public/`, and now reports which filenames it looked for when a family cannot be resolved, which makes misnamed files much easier to debug.

```ts
export default defineNuxtConfig({
  fonts: {
    local: {
      paths: ['assets/fonts'],
    },
  },
})
```

### Reuse resolved fonts from another module

Modules that need the fonts your app already uses - for example, to [render an OG image](https://github.com/nuxt-modules/og-image/) or a PDF - had to reverse-engineer internal build machinery to find them, then re-resolve and re-download the same families themselves.

The new `fonts:resolved` hook reports each family as it is resolved, with the URL every font file is served from and a `readFont()` to read its contents, so nothing has to be resolved or downloaded more than once.

```ts
const files = new Map<string, () => Promise<Buffer>>()

nuxt.hook('fonts:resolved', (font) => {
  for (const file of font.files) {
    files.set(file.url, file.readFont)
  }
})
```

Listeners run while your stylesheets are transformed, so collect what you need and call `readFont()` later. See [the hook documentation](https://fonts.nuxt.com/advanced#fontsresolved).

### Custom CSS variable prefixes

[`processCSSVariables`](https://fonts.nuxt.com/get-started/configuration#processcssvariables) accepts a custom prefix, so `processCSSVariables: 'my-app'` processes `--my-app-*` variables only.

## 🩹 Fixes

- Font asset URLs respect the app `baseURL` and a custom `cdnURL`
- Inlined `@font-face` rules are deduplicated in the rendered HTML
- Font downloads are retried before a build is failed
- Local variable fonts with weight ranges resolve correctly
- Fallback metrics are generated for fonts in the public directory
- Nitro v3 and Nuxt 5 compatibility
- Devtools UI works under a custom `baseURL` and with `@nuxt/devtools` v4
- Deprecated `experimental.processCSSVariables` now warns rather than being silently ignored
- Dev font server errors are passed to the next middleware instead of hanging the request
- Multiple `families` entries sharing a name are all applied
- The `local` provider detects camel-cased variable font markers in filenames
- Font faces injected into bundled CSS resolve their URLs correctly
- Hoisted global font faces are minified
- Fallbacks are not regenerated for already-transformed declarations
- The `local` provider no longer scans `nitro.publicAssets` directories registered by modules

## 🙏 Thank you

Thank you so much to everyone who has contributed to `@nuxt/fonts`, `unifont`, `fontaine` and `fontless` to get us here. ❤️

## 🚀 How to upgrade

After upgrading to the latest version, clear your font cache and rebuild:

```bash
rm -rf node_modules/.cache/nuxt/fonts
```

Please read the [upgrade guide](https://fonts.nuxt.com/get-started/upgrade) for the full detail, and let me know how you get on! 🙏

## 👉 Changelog

[compare changes](https://github.com/nuxt/fonts/compare/v0.14.0...v1.0.0)

### 🚀 Enhancements

- use devframe-based devtools from `fontless` (#937)
- add `fonts:resolved` hook (#921)
- ⚠️  serve fonts as vite build assets under `buildAssetsDir` (#918)
- generate fallback metrics for `global` families where used (#915)
- inject font faces under the webpack and rspack builders (#914)
- support resolving variable font axes (#909)
- **local:** accept named font weights in config and filename aliases ([`136ac36`](https://github.com/nuxt/fonts/commit/136ac36))
- **deps:** update `fontless` to `0.4.3` (#421)
- subset downloaded fonts to the glyphs a family declares (#131)
- **local:** report filenames looked for when a family can't be resolved (#895)
- **npm:** resolve installed font packages with `resolve` + `exists` hooks (#894)
- ⚠️  **deps:** update `fontless` and `unifont` (#887)
- **local:** support scanning font files from additional directories (#876)
- configurable font cache (#869)
- ⚠️  **deps:** update `unifont`, `fontaine` and `fontless` (#868)

### 🩹 Fixes

- resolve urls of font faces injected into bundled css (#939)
- minify hoisted global font faces ([`6103883`](https://github.com/nuxt/fonts/commit/6103883))
- don't regenerate fallbacks for already-transformed declarations ([`60d7904`](https://github.com/nuxt/fonts/commit/60d7904))
- **local:** only scan layer `public/` directories (#938)
- support multiple `families` entries with the same name ([`d7987a8`](https://github.com/nuxt/fonts/commit/d7987a8))
- **local:** detect camel-cased variable font markers (#931)
- use explicit file extensions in relative imports (#930)
- **local:** scan for font files during module setup (#929)
- use `fontless` preload selection (#920)
- fail before downloading fonts that need a missing `subset-font` ([`00436e1`](https://github.com/nuxt/fonts/commit/00436e1))
- respect user weights if provided ([`8b6d7f0`](https://github.com/nuxt/fonts/commit/8b6d7f0))
- apply the default `400 700` weight range (#619)
- **local:** generate fallback metrics for public directory fonts (#171)
- nitro v3 compatibility (#898)
- warn when deprecated `experimental.processCSSVariables` is set (#892)
- pass dev font server errors to the next middleware (#891)
- deduplicate inlined `@font-face` rules in rendered html (#879)
- retry font downloads and fail production builds on font errors (#877)
- support local variable fonts with weight ranges (#794)
- inline font faces from global stylesheets (#875)
- prefix font asset URLs with app `baseURL` ([`1f13e79`](https://github.com/nuxt/fonts/commit/1f13e79))
- respect `baseURL` when serving devtools UI ([`918d036`](https://github.com/nuxt/fonts/commit/918d036))
- consider global fonts for preloading as well (#856)
- **devtools:** use hook for compat with devtools v4 ([`05ae60c`](https://github.com/nuxt/fonts/commit/05ae60c))
- strip style queries when tracking fonts to preload (#872)
- pass a real H3Event in storybook mode (#807)

### 💅 Refactors

- let `fontless` fill per-category fallback defaults (#893)
- **client:** migrate away from devtools-ui-kit ([`ad5b781`](https://github.com/nuxt/fonts/commit/ad5b781))

### 📖 Documentation

- add docs for devtools panel and `fonts:resolved` ([`c9478ca`](https://github.com/nuxt/fonts/commit/c9478ca))
- document variable font usage and naming (#933)
- note that non-default subsets need configuring (#932)
- cover unicode ranges in `glyphs` and provider failure isolation ([`4b7a21b`](https://github.com/nuxt/fonts/commit/4b7a21b))
- correct some inaccuracies in the docs ([`823edb0`](https://github.com/nuxt/fonts/commit/823edb0))
- refresh the docs site for v1 (#919)
- note that lightningcss minification needs the optional peer ([`8928fb0`](https://github.com/nuxt/fonts/commit/8928fb0))
- update upgrade guide ([`5f41ed3`](https://github.com/nuxt/fonts/commit/5f41ed3))
- document `global` as the escape hatch for undetectable font usage (#917)
- drop mention of tailwindcss v3 ([`b764025`](https://github.com/nuxt/fonts/commit/b764025))

### 🏡 Chore

- fix typecheck against the module stub ([`99bb608`](https://github.com/nuxt/fonts/commit/99bb608))
- pin nuxt 5 playground ([`7a46fde`](https://github.com/nuxt/fonts/commit/7a46fde))
- **client:** don't overwrite built client when running playground ([`bb36013`](https://github.com/nuxt/fonts/commit/bb36013))
- exempt first-party packages from pnpm `minimumReleaseAge` (#862)
- replace `latest` ranges with caret ranges (#861)
- migrate to pnpm v11 (#831)
- migrate npm badges and links to npmx.dev ([`a5c61fb`](https://github.com/nuxt/fonts/commit/a5c61fb))

### ✅ Tests

- tolerate per-file font face duplication in bundled css ([`a5a4dd9`](https://github.com/nuxt/fonts/commit/a5a4dd9))
- clear the font cache of every fixture and playground ([`7995bd1`](https://github.com/nuxt/fonts/commit/7995bd1))
- cover tailwind v4 `--default-font-family` theme variables (#890)
- cover family-level font-face descriptor overrides (#888)
- cover font URLs in inlined styles with a custom `cdnURL` (#880)
- drop tailwindcss v3 ([`d7921fb`](https://github.com/nuxt/fonts/commit/d7921fb))
- use human readable font names in snapshots ([`d119be1`](https://github.com/nuxt/fonts/commit/d119be1))
- refresh snapshots + make resilient to vite 8 changes (#857)
- update test assertions for vite 8 ([`16e87f6`](https://github.com/nuxt/fonts/commit/16e87f6))
- mock adobe api responses (#819)

### 🤖 CI

- use `pnpm/setup` and `devEngines` (#907)
- adopt uppt for release workflow (#866)
- run ci for merge groups ([`8c3dd7f`](https://github.com/nuxt/fonts/commit/8c3dd7f))
- migrate agentscan-action to v2 ([`7dd7a38`](https://github.com/nuxt/fonts/commit/7dd7a38))
- add agent-scan workflow to flag bot-authored PRs ([`349b7ba`](https://github.com/nuxt/fonts/commit/349b7ba))
- rename workflow ([`8154aa6`](https://github.com/nuxt/fonts/commit/8154aa6))
- avoid checkout for reproduction comment ([`ed921dc`](https://github.com/nuxt/fonts/commit/ed921dc))

### 🎉 New Contributors

- Peter Uithoven (@peteruithoven)
- Meliceanu (@Meliceanu)
- Cynthia Rey (@cyyynthia)

### ❤️ Contributors

- Daniel Roe (@danielroe)
- Harlan Wilton (@harlan-zw)
- Peter Uithoven (@peteruithoven)
- Meliceanu (@Meliceanu)
- Cynthia Rey (@cyyynthia)

---

## v4.6.1 (nuxt/nuxt) - 2026-10-09

[Release notes](https://github.com/nuxt/nuxt/releases/tag/v4.6.1)

> v4.6.1 is the next patch release.

## 👉 Changelog

[compare changes](https://github.com/nuxt/nuxt/compare/v4.6.0...v4.6.1)

### 🔥 Performance

- **nitro:** build the portable event's web view on first access ([`cffb182d6`](https://github.com/nuxt/nuxt/commit/cffb182d6))

### 🩹 Fixes

- **vite:** match vite 8.1+ optimizer messages for deps hint (#36525)
- **nuxt:** accept any `baseURL` when fetch response type is named (#36523)
- **nitro:** resolve `nitropack/types` declarations under nodenext ([`242e1971e`](https://github.com/nuxt/nuxt/commit/242e1971e))
- **nuxt:** allow `false` in `setPageLayout` types (#36506)
- **nuxt:** align `Serialize` object types with JSON (#36503)
- **vite:** don't abort dep scan on virtual imports in installed packages (#36477)
- **nuxt:** update `publishConfig` config export extension ([`64fa191cb`](https://github.com/nuxt/nuxt/commit/64fa191cb))
- **kit:** install the package a missing subpath belongs to (#36507)
- **vite-server:** use the configured outDir as the public directory for non-ssr environment (#36501)
- **kit,nitro:** match dev handler paths on both nitro majors (#36515)
- **nuxt:** preserve onServerPrefetch for useId hydration (#36430)
- **vite-server:** include the request in dev error reports (#36489)
- **nitro:** register each dev server handler once (#36493)
- **nitro:** pass `RequestEvent` to `nuxt` dev server handlers ([`e6beceea2`](https://github.com/nuxt/nuxt/commit/e6beceea2))
- **nuxt:** type the global `$fetch` with nuxt's `TypedFetch` (#36492)
- **vite-server:** work with deploy target plugins in dev (#36491)
- **schema:** ignore `.wrangler` directory (#36487)
- **vite-server:** pass the path to the error page render (#36488)
- **nuxt,vite:** disable dev error broadcast if `BroadcastChannel` throws (#36480)
- **kit:** align semantic version regexp with nightly version format (#36479)
- **nuxt:** export types reachable from async data composables (#36478)
- **vite:** detect enclosing string delimiter in inline style urls (#36476)
- **schema:** type the `nuxt` dev server handler variant ([`452052793`](https://github.com/nuxt/nuxt/commit/452052793))
- **nitro:** inline nuxt runtime when resolved to windows paths ([`21657c6fc`](https://github.com/nuxt/nuxt/commit/21657c6fc))
- **nitro:** resolve `unhead` from nuxt in server bundle ([`dc1e2d6e6`](https://github.com/nuxt/nuxt/commit/dc1e2d6e6))

### 💅 Refactors

- **kit:** use `package-manager-detector` workspace + deno handling ([`1563a6d25`](https://github.com/nuxt/nuxt/commit/1563a6d25))

### 📖 Documentation

- document dev server handlers and `nuxt/server` scope ([`7c36a1352`](https://github.com/nuxt/nuxt/commit/7c36a1352))
- fix nightly examples (#36486)

### 🏡 Chore

- remove `CLAUDE.md` (#36462)
- relax minimum release age exclude ([`bdf98e936`](https://github.com/nuxt/nuxt/commit/bdf98e936))
- update welcome template ([`787d0d980`](https://github.com/nuxt/nuxt/commit/787d0d980))

### ✅ Tests

- resolve temporary fixture paths on macos ([`30742865c`](https://github.com/nuxt/nuxt/commit/30742865c))
- update test expectation ([`1f22a114d`](https://github.com/nuxt/nuxt/commit/1f22a114d))

### 🤖 CI

- publish 4.x releases to `latest` ([`682605dba`](https://github.com/nuxt/nuxt/commit/682605dba))
- update release workflows ([`3b8853489`](https://github.com/nuxt/nuxt/commit/3b8853489))

### 🎉 New Contributors

- okueng (@okueng)
- Kaan Gökdemir (@kaangokdemir)
- Kazbek Askarov (@kazbekaskarov)
- QvarcY (@QvarcY)
- Bruno Belloni (@brunobelloni)
- Arnaud Dematte (@adematte)

### ❤️ Contributors

- Daniel Roe (@danielroe)
- Sébastien Chopin (@atinux)
- okueng (@okueng)
- Kaan Gökdemir (@kaangokdemir)
- Kazbek Askarov (@kazbekaskarov)
- Estéban (@Barbapapazes)
- QvarcY (@QvarcY)
- Bruno Belloni (@brunobelloni)
- Amulet Kerria (@KazariEX)
- abeer0 (@iiio2)
- Arnaud Dematte (@adematte)

---

## v2.0.0-beta.14 (nuxt/scripts) - 2026-10-06

[Release notes](https://github.com/nuxt/scripts/releases/tag/v2.0.0-beta.14)

### &nbsp;&nbsp;&nbsp;🐞 Bug Fixes

- Accept Nuxt 5 nightlies and restore the Nitro 3 CI job &nbsp;-&nbsp; by @harlan-zw in https://github.com/nuxt/scripts/issues/948 [<samp>(19d6f)</samp>](https://github.com/nuxt/scripts/commit/19d6f6d8)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/scripts/compare/v2.0.0-beta.13...v2.0.0-beta.14)

---

## v2.0.0-beta.13 (nuxt/scripts) - 2026-10-06

[Release notes](https://github.com/nuxt/scripts/releases/tag/v2.0.0-beta.13)

### &nbsp;&nbsp;&nbsp;🚨 Breaking Changes

- Require Nuxt 4.6 and use portable server APIs &nbsp;-&nbsp; by @harlan-zw and @onmax in https://github.com/nuxt/scripts/issues/946 [<samp>(00414)</samp>](https://github.com/nuxt/scripts/commit/0041431e)

##### &nbsp;&nbsp;&nbsp;&nbsp;[View changes on GitHub](https://github.com/nuxt/scripts/compare/v2.0.0-beta.12...v2.0.0-beta.13)

---
