---
title: "Check for Update Strategy"
description: "Choose the best update detection strategy for your platform."
canonical_url: "https://nuxtseo.com/docs/skew-protection/guides/update-strategies"
last_updated: "2026-05-25T12:18:39.855Z"
---

When you deploy a new version of your Nuxt app we need to notify active users of the new version. By default, Nuxt applies a polling strategy, checking every hour if the build is out of date.

Alternative strategies like Server-Sent Events (SSE), WebSockets, and external providers provide real-time notifications, but have different platform compatibilities and performance trade-offs.

<table>
<thead>
  <tr>
    <th>
      Strategy
    </th>
    
    <th>
      Real-time
    </th>
    
    <th>
      Platforms
    </th>
    
    <th>
      Server Load
    </th>
    
    <th>
      Client Connections
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        <a href="#polling">
          Polling
        </a>
      </strong>
    </td>
    
    <td>
      ❌ Delayed
    </td>
    
    <td>
      ✅ All
    </td>
    
    <td>
      ✅ Minimal
    </td>
    
    <td>
      ✅ None
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        <a href="#sse">
          SSE
        </a>
      </strong>
    </td>
    
    <td>
      ✅ Instant
    </td>
    
    <td>
      ⚠️ Node.js/Bun/Deno
    </td>
    
    <td>
      ⚠️ Low
    </td>
    
    <td>
      ⚠️ Persistent
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        <a href="#websocket">
          WebSocket
        </a>
      </strong>
    </td>
    
    <td>
      ✅ Instant
    </td>
    
    <td>
      ⚠️ Cloudflare Durable
    </td>
    
    <td>
      ⚠️ Moderate
    </td>
    
    <td>
      ⚠️ Persistent
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        <a href="#adapter">
          Adapter
        </a>
      </strong>
    </td>
    
    <td>
      ✅ Instant
    </td>
    
    <td>
      ✅ All (incl. Static)
    </td>
    
    <td>
      ✅ None (external)
    </td>
    
    <td>
      ✅ External provider
    </td>
  </tr>
</tbody>
</table>

## Performance Considerations

SSE and [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) strategies maintain persistent connections on your server. For **high-traffic applications** (10,000+ concurrent users), using an [Adapter](#adapter) with external providers like Ably or Pusher may be worthwhile.

<callout type="info">

The module automatically excludes bot traffic from connections when you install `@nuxtjs/robots`. See [Bot Traffic Filtering](/docs/skew-protection/guides/performance#bot-traffic-filtering).

</callout>

See the [Performance Guide](/docs/skew-protection/guides/performance) for more details.

## Platform Defaults

The module automatically selects the best strategy based on your deployment platform, but you can override it in your configuration using
[`updateStrategy`](/docs/skew-protection/api/config#updatestrategy-polling--sse--ws).

<table>
<thead>
  <tr>
    <th>
      Provider
    </th>
    
    <th>
      updateStrategy
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <strong>
        Node.js
      </strong>
    </td>
    
    <td>
      <code>
        sse
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Bun
      </strong>
    </td>
    
    <td>
      <code>
        sse
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Deno
      </strong>
    </td>
    
    <td>
      <code>
        sse
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Vercel
      </strong>
    </td>
    
    <td>
      <code>
        sse
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Cloudflare Workers
      </strong>
    </td>
    
    <td>
      <code>
        polling
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Cloudflare Durable
      </strong>
    </td>
    
    <td>
      <code>
        ws
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Netlify
      </strong>
    </td>
    
    <td>
      <code>
        sse
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <strong>
        Static/Prerendered
      </strong>
    </td>
    
    <td>
      <code>
        polling
      </code>
      
       or <a href="#adapter">
        adapter
      </a>
    </td>
  </tr>
</tbody>
</table>

Note: For `ws` strategy, you must enable `nuxt.options.nitro.experimental.websocket`.

## Polling

The default strategy that works on **all platforms**. Uses Nuxt's built-in `experimental.checkOutdatedBuildInterval` to periodically fetch `builds/latest.json`
to determine if a new deployment has occurred.

Update `checkOutdatedBuildInterval` to a quicker polling interval - 1 hour is too slow for most applications.

```ts [nuxt.config.ts]
export default defineNuxtConfig({
  skewProtection: {
    updateStrategy: 'polling'
  },
  experimental: {
    checkOutdatedBuildInterval: 5 * 60 * 1000 // 5 minutes
  }
})
```

## SSE

Real-time updates using **Server-Sent Events**. SSE does keep persistent connections open, be mindful of this if you have a high-traffic site.
SSE has less overhead than WebSockets.

```ts [nuxt.config.ts]
export default defineNuxtConfig({
  skewProtection: {
    updateStrategy: 'sse'
  }
})
```

## WebSocket

Real-time updates using **WebSockets**. These are useless as SSE is more performant however for certain
conditions like using Cloudflare Workers and some proxying services, WebSockets may be the best option.

```ts [Cloudflare Durable Objects]
export default defineNuxtConfig({
  nitro: {
    preset: 'cloudflare-durable',
    experimental: {
      websocket: true
    }
  },
  skewProtection: {
    updateStrategy: 'ws'
  }
})
```

## Adapter

Adapters allow you to use **external WebSocket providers** for real-time update notifications. This is ideal for **static/prerendered sites** or when you want to offload connection management to a third-party service.

Available adapters:

- [Pusher](/docs/skew-protection/providers/external#pusher)
- [Ably](/docs/skew-protection/providers/external#ably)
- [Custom](/docs/skew-protection/providers/external#custom-adapters)

```ts [nuxt.config.ts]
import { pusherAdapter } from 'nuxt-skew-protection/adapters/pusher'

export default defineNuxtConfig({
  skewProtection: {
    updateStrategy: pusherAdapter({
      key: process.env.PUSHER_KEY,
      cluster: process.env.PUSHER_CLUSTER,
      appId: process.env.PUSHER_APP_ID,
      secret: process.env.PUSHER_SECRET,
    })
  }
})
```

See [External Providers](/docs/skew-protection/providers/external) for detailed setup guides.
