v1.0.0 · Nuxt Skew Protection · Nuxt SEO

[NuxtSEO Pro](https://nuxtseo.com/ "Home")

- [Modules](https://nuxtseo.com/docs/nuxt-seo/getting-started/introduction)
- [Tools](https://nuxtseo.com/tools)
- [Pro](https://nuxtseo.com/pro)
- [Learn SEO](https://nuxtseo.com/learn-seo/nuxt) [Releases](https://nuxtseo.com/releases)

[Sign In](https://nuxtseo.com/auth/github)

[Nuxt SEO on GitHub](https://github.com/harlan-zw/nuxt-seo)

[User Guides](https://nuxtseo.com/docs/skew-protection/getting-started/introduction)

[API](https://nuxtseo.com/docs/skew-protection/api/use-skew-protection)

[Releases](https://nuxtseo.com/docs/skew-protection/releases/v1)

Skew Protection

- [Switch to Skew Protection](https://nuxtseo.com/docs/skew-protection/getting-started/introduction)
- [Switch to Nuxt SEO](https://nuxtseo.com/docs/nuxt-seo/getting-started/introduction)
- [Switch to Robots](https://nuxtseo.com/docs/robots/getting-started/introduction)
- [Switch to Sitemap](https://nuxtseo.com/docs/sitemap/getting-started/introduction)
- [Switch to OG Image](https://nuxtseo.com/docs/og-image/getting-started/introduction)
- [Switch to Schema.org](https://nuxtseo.com/docs/schema-org/getting-started/introduction)
- [Switch to Link Checker](https://nuxtseo.com/docs/link-checker/getting-started/introduction)
- [Switch to SEO Utils](https://nuxtseo.com/docs/seo-utils/getting-started/introduction)
- [Switch to Site Config](https://nuxtseo.com/docs/site-config/getting-started/introduction)
- [Switch to AI Ready](https://nuxtseo.com/docs/ai-ready/getting-started/introduction)

Search…```k`` /`

v1.1.1

- [Discord Support](https://discord.com/invite/275MBUBvgP)

### Changelog

### Releases

- [v1.0.0](https://nuxtseo.com/docs/skew-protection/releases/v1)

Releases

# v1.0.0

[Copy for LLMs](https://nuxtseo.com/docs/skew-protection/releases/v1.md)

## [Introduction](#introduction)

Nuxt Skew Protection v1 marks the module's first stable release. The focus: giving you full control over **how** and **when** outdated clients respond to new deployments, while making version state observable on both client and server.

This release also cleans up the API surface, shortening names and aligning conventions before committing to semver stability.

Run the automated codemod to migrate your project, or paste the [LLM upgrade prompt](#llm-upgrade-prompt) into Claude, [ChatGPT](https://chatgpt.com), etc. for a guided migration.

```
npx nuxt-skew-protection migrate
```

See the [breaking changes](#breaking-changes) below for details on what changed.

## [🔍 Server Version Awareness](#server-version-awareness)

Every incoming request now carries `event.context.skewVersion` populated from the client's cookie. Use the new `getClientVersion(event)` server utility to read it explicitly, or `isClientOutdated(event)` to check staleness in API handlers.

```
export default defineEventHandler((event) => {
  if (isClientOutdated(event)) {
    // return stale-safe response or set cache headers
  }
})
```

## [⏪ Rollback Detection](#rollback-detection)

The composable now exposes an `isRollback` computed ref that is `true` when the server version is **older** than the client version, indicating a deployment was rolled back. This lets you distinguish "user needs to update" from "we rolled back, the user is ahead."

## [🛠️ DevTools Panel](#️-devtools-panel)

A new Nuxt DevTools panel gives you full visibility into skew protection state during development. It includes four tabs:

- **Overview** shows your resolved module configuration and, when connected to a production URL, displays real time health status and active connection stats.
- **Versions** lists all stored deployment versions with build timestamps, asset counts, and expiration status.
- **Connections** shows version distribution and route distribution across active users (requires `connectionTracking: true`).
- **Docs** links directly to the module documentation.

The panel is available at `/__nuxt-skew-protection` in dev mode and can proxy production endpoints for live debugging.

## [⚡ Multi-Tab Coordination](#multi-tab-coordination)

Version detection gets faster when multiple tabs share discoveries. When one tab detects a deployment update, every other tab in the same browser learns about it instantly via `BroadcastChannel`, eliminating duplicate polling and reducing unnecessary network requests. Enabled by default; disable with `multiTab: false`.

## [🔄 Reload Strategies](#reload-strategies)

Previously the module always showed a notification and waited for the user to click reload. Now you choose the behaviour that fits your app with a single config option.

```
export default defineNuxtConfig({
  skewProtection: {
    // 'prompt' (default) | 'immediate' | 'idle' | false
    reloadStrategy: 'idle',
  },
})
```

`immediate` reloads the moment chunks are invalidated. `idle` waits until the user switches tabs or the browser is idle, avoiding mid-interaction disruption. Set `false` to disable built-in handling and drive your own logic through hooks.

## [⚠️ Breaking Changes](#️-breaking-changes)

### [Dependency Version Bumps](#dependency-version-bumps)

The following internal dependencies have new minimum versions. These shouldn't have any direct effect on your site, however, you may want to double check their release notes.

- **nuxt-site-config** v4: [breaking changes](https://github.com/harlan-zw/nuxt-site-config/releases/tag/v4.0.0)

### [Hook Renamed: `skew:chunks-outdated`](#hook-renamed-skewchunks-outdated)

The Nuxt hook `skew-protection:chunks-outdated` has been shortened to `skew:chunks-outdated`.

```
// Before
nuxtApp.hooks.hook('skew-protection:chunks-outdated', (payload) => {
  // ...
})

// After
nuxtApp.hooks.hook('skew:chunks-outdated', (payload) => {
  // ...
})
```

### [Composable Return: `isAppOutdated`](#composable-return-isappoutdated)

`isOutdated` was renamed to `isAppOutdated` to distinguish it from chunk-level staleness.

```
// Before
const { isOutdated } = useSkewProtection()

// After
const { isAppOutdated } = useSkewProtection()
```

### [Config: `bundleAssets`](#config-bundleassets)

`bundlePreviousDeploymentChunks` was renamed to `bundleAssets` for brevity.

```
// Before
const before = { skewProtection: { bundlePreviousDeploymentChunks: true } }

// After
const after = { skewProtection: { bundleAssets: true } }
```

### [Route Prefix: `/__skew/`](#route-prefix-__skew)

Internal API routes moved from `/_skew/` to `/__skew/` (double underscore) to follow the Nuxt convention for internal routes. Update any custom proxy rules or firewall allowlists.

### [Cookie Defaults](#cookie-defaults)

`sameSite` changed from `strict` to `lax` so the cookie survives cross-origin navigations (e.g. OAuth redirects). `maxAge` shortened from 60 days to 7 days to reduce stale version drift.

### [Standalone `checkForUpdates` Removed](#standalone-checkforupdates-removed)

We removed the standalone export. Use the composable method instead:

```
// Before
import { checkForUpdates } from '#skew-protection'

// After
const { checkForUpdates } = useSkewProtection()
```

### [Legacy `_generate` Compat Removed](#legacy-_generate-compat-removed)

We removed the internal `_generate` compatibility check from early pre-releases. If you were on v0.4 or earlier, upgrade to v0.7.6 first, then to v1.

## [🤖 LLM Upgrade Prompt {#llm-upgrade-prompt}](#llm-upgrade-prompt-llm-upgrade-prompt)

Paste this into Claude, ChatGPT, or any LLM to migrate your codebase automatically.

Show LLM Upgrade Prompt

```
# Upgrade Guide: nuxt-skew-protection v0.x to v1.0.0

You are helping me upgrade nuxt-skew-protection from v0.x to v1.0.0 in my Nuxt project.

## Breaking Changes

### 1. Hook Renamed

**What changed:** \`skew-protection:chunks-outdated\` → \`skew:chunks-outdated\`

**Search my codebase for:** \`skew-protection:chunks-outdated\`

**Regex pattern:** \`skew-protection:chunks-outdated\`

**Before:**
\`\`\`ts
nuxtApp.hooks.hook('skew-protection:chunks-outdated', callback)
\`\`\`

**After:**
\`\`\`ts
nuxtApp.hooks.hook('skew:chunks-outdated', callback)
\`\`\`

### 2. Composable Return Renamed

**What changed:** \`isOutdated\` → \`isAppOutdated\` on the \`useSkewProtection()\`{lang="ts"} return.

**Search my codebase for:** \`isOutdated\`

**Regex pattern:** \`isOutdated(?!Payload|\.)\`{lang="ts"}

**Before:**
\`\`\`ts
const { isOutdated } = useSkewProtection()
\`\`\`

**After:**
\`\`\`ts
const { isAppOutdated } = useSkewProtection()
\`\`\`

### 3. Config Renamed

**What changed:** \`bundlePreviousDeploymentChunks\` → \`bundleAssets\`

**Search my codebase for:** \`bundlePreviousDeploymentChunks\`

**Regex pattern:** \`bundlePreviousDeploymentChunks\`

**Before:**
\`\`\`ts
skewProtection: { bundlePreviousDeploymentChunks: true }
\`\`\`

**After:**
\`\`\`ts
skewProtection: { bundleAssets: true }
\`\`\`

### 4. Route Prefix Changed

**What changed:** \`/_skew/\` → \`/__skew/\` (double underscore)

**Search my codebase for:** \`/_skew/\`

**Regex pattern:** \`/_skew/\`

**Before:**
\`\`\`ts
$fetch('/_skew/sse')
\`\`\`

**After:**
\`\`\`ts
$fetch('/__skew/sse')
\`\`\`

### 5. Standalone checkForUpdates Removed

**What changed:** The standalone \`checkForUpdates\` export no longer exists. Use the composable.

**Search my codebase for:** \`import { checkForUpdates }\`

**Regex pattern:** \`checkForUpdates.*from.*#skew\`

**Before:**
\`\`\`ts
import { checkForUpdates } from '#skew-protection'
checkForUpdates()
\`\`\`

**After:**
\`\`\`ts
const { checkForUpdates } = useSkewProtection()
checkForUpdates()
\`\`\`

### 6. Cookie Defaults Changed

**What changed:** \`sameSite\` is now \`lax\` (was \`strict\`), \`maxAge\` is now 7 days (was 60 days).

**Action:** No code changes needed unless you explicitly rely on the old defaults. If you need the old behaviour, set them in config:

\`\`\`ts
skewProtection: {
  cookie: { sameSite: 'strict', maxAge: 60 * 60 * 24 * 60 }
}
\`\`\`

## Verification Checklist

1. \`pnpm install\` (update lockfile)
2. \`npx nuxi typecheck\` (catch type errors)
3. \`pnpm build\` (catch build-time issues)
4. \`pnpm test\` (catch runtime regressions)
5. Test SSR page load, verify no hydration mismatch warnings

---

Please scan my codebase for all affected patterns listed above and generate a complete migration plan. For each file that needs changes, show me the exact diff.
```

## [✅ Upgrading](#upgrading)

```
# pnpm
pnpm add nuxt-skew-protection@^1

# npm
npm install nuxt-skew-protection@^1

# yarn
yarn add nuxt-skew-protection@^1
```

## [📋 Changelog](#changelog)

> [Compare changes](https://github.com/harlan-zw/nuxt-skew-protection/compare/v0.7.6...v1.0.0)
### [🚀 Enhancements](#enhancements)

- `reloadStrategy` option: `prompt`, `immediate`, `idle`, or `false` ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- Multi-tab coordination via `BroadcastChannel` ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- `/__skew/health` monitoring endpoint ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- `event.context.skewVersion` on all server requests ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- `getClientVersion(event)` server utility ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- `isRollback` detection on composable ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- `serverVersion` reactive ref on composable ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- `isOpen` slot prop on `SkewNotification` ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- SSR hydration via `useState` for `isConnected`, `serverVersion`, `manifest` ([`4b6a9fe`](https://github.com/harlan-zw/nuxt-skew-protection/commit/4b6a9fe))
- DevTools panel with overview, version history, connection monitoring, and production debug endpoints ([`8dc6d1e`](https://github.com/harlan-zw/nuxt-skew-protection/commit/8dc6d1e))

### [🩹 Fixes](#fixes)

- Handle possibly undefined manifest in multi-tab plugin ([`d19bfcf`](https://github.com/harlan-zw/nuxt-skew-protection/commit/d19bfcf))

### [🏡 Chore](#chore)

- Bump and lint ([`ce83636`](https://github.com/harlan-zw/nuxt-skew-protection/commit/ce83636))
- Sync CI and kit utilities ([`c59600e`](https://github.com/harlan-zw/nuxt-skew-protection/commit/c59600e))

### [❤️ Contributors](#️-contributors)

- [Harlan Wilton](https://github.com/harlan-zw)

[Edit this page](https://github.com/nuxt-seo-pro/nuxt-skew-protection/edit/main/docs/content/4.releases/v1.md)

[Markdown For LLMs](https://nuxtseo.com/docs/skew-protection/releases/v1.md)

Did this page help you?

[Cloudflare Configure Nuxt Skew Protection for Cloudflare Workers, Pages, and NuxtHub.](https://nuxtseo.com/docs/skew-protection/providers/cloudflare) 

On this page

- [Introduction](#introduction)
- [🔍 Server Version Awareness](#server-version-awareness)
- [⏪ Rollback Detection](#rollback-detection)
- [🛠️ DevTools Panel](#️-devtools-panel)
- [⚡ Multi-Tab Coordination](#multi-tab-coordination)
- [🔄 Reload Strategies](#reload-strategies)
- [⚠️ Breaking Changes](#️-breaking-changes)
- [🤖 LLM Upgrade Prompt {#llm-upgrade-prompt}](#llm-upgrade-prompt-llm-upgrade-prompt)
- [✅ Upgrading](#upgrading)
- [📋 Changelog](#changelog)

[GitHub](https://github.com/harlan-zw/nuxt-seo) [ Discord](https://discord.com/invite/275MBUBvgP)

### [NuxtSEO](https://nuxtseo.com/ "Home")

- [Getting Started](https://nuxtseo.com/docs/nuxt-seo/getting-started/introduction)
- [MCP](https://nuxtseo.com/docs/nuxt-seo/guides/mcp)

Modules

- [Robots](https://nuxtseo.com/docs/robots/getting-started/introduction)
- [Sitemap](https://nuxtseo.com/docs/sitemap/getting-started/introduction)
- [OG Image](https://nuxtseo.com/docs/og-image/getting-started/introduction)
- [Schema.org](https://nuxtseo.com/docs/schema-org/getting-started/introduction)
- [Link Checker](https://nuxtseo.com/docs/link-checker/getting-started/introduction)
- [SEO Utils](https://nuxtseo.com/docs/seo-utils/getting-started/introduction)
- [Site Config](https://nuxtseo.com/docs/site-config/getting-started/introduction)
- [Skew Protection](https://nuxtseo.com/docs/skew-protection/getting-started/introduction)
- [AI Ready](https://nuxtseo.com/docs/ai-ready/getting-started/introduction)

### [NuxtSEO Pro](https://nuxtseo.com/pro "Nuxt SEO Pro")

- [Getting Started](https://nuxtseo.com/pro)
- [Dashboard](https://nuxtseo.com/pro/dashboard)
- [Pro MCP](https://nuxtseo.com/pro/docs/getting-started/mcp-setup)

### [Learn SEO](https://nuxtseo.com/learn-seo "Learn SEO")

Nuxt

- [Mastering Meta](https://nuxtseo.com/learn-seo/nuxt/mastering-meta)
- [Controlling Crawlers](https://nuxtseo.com/learn-seo/nuxt/controlling-crawlers)
- [Launch & Listen](https://nuxtseo.com/learn-seo/nuxt/launch-and-listen)
- [Routes & Rendering](https://nuxtseo.com/learn-seo/nuxt/routes-and-rendering)
- [Staying Secure](https://nuxtseo.com/learn-seo/nuxt/routes-and-rendering/security)

Vue

- [Vue SEO Guide](https://nuxtseo.com/learn-seo/vue)
- [Mastering Meta](https://nuxtseo.com/learn-seo/vue/mastering-meta)
- [Controlling Crawlers](https://nuxtseo.com/learn-seo/vue/controlling-crawlers)
- [SPA SEO](https://nuxtseo.com/learn-seo/vue/spa)
- [SSR Frameworks](https://nuxtseo.com/learn-seo/vue/ssr-frameworks)
- [SEO Checklist](https://nuxtseo.com/learn-seo/checklist)
- [Pre-Launch Warmup](https://nuxtseo.com/learn-seo/pre-launch-warmup)
- [Backlinks & Authority](https://nuxtseo.com/learn-seo/backlinks)

### [Tools](https://nuxtseo.com/tools "SEO Tools")

- [Social Share Debugger](https://nuxtseo.com/tools/social-share-debugger)
- [Robots.txt Generator](https://nuxtseo.com/tools/robots-txt-generator)
- [Meta Tag Checker](https://nuxtseo.com/tools/meta-tag-checker)
- [HTML to Markdown](https://nuxtseo.com/tools/html-to-markdown)
- [XML Sitemap Validator](https://nuxtseo.com/tools/xml-sitemap-validator)
- [Schema.org Validator](https://nuxtseo.com/tools/schema-validator)
- [Keyword Idea Generator](https://nuxtseo.com/tools/keyword-generator)
- [Keyword Research](https://nuxtseo.com/tools/keyword-research)
- [SERP Analyzer](https://nuxtseo.com/tools/serp-analyzer)
- [Domain Rankings](https://nuxtseo.com/tools/domain-rankings)

Copyright © 2023-2026 Harlan Wilton - [MIT License](https://github.com/harlan-zw/nuxt-seo/blob/main/license) · [mdream](https://mdream.dev)