Fix: Adapter Does Not Support Server Output in Astro

Error message:
Adapter does not support server output.
Adapters & SSR 2025-01-25

What Causes This Error?

This error occurs when your adapter configuration doesn’t match your output mode, or when you have server-rendered pages but the adapter is configured for static output only.

The Problem

// astro.config.mjs
import { defineConfig } from 'astro/config';
import adapter from 'some-static-only-adapter';

export default defineConfig({
  output: 'server', // ❌ Requires SSR
  adapter: adapter(), // ❌ Adapter only supports static
});

The Fix

Use Compatible Adapter

// astro.config.mjs
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';

export default defineConfig({
  output: 'server',
  adapter: vercel(), // ✅ Supports SSR
});

Or Change Output Mode

// astro.config.mjs
export default defineConfig({
  output: 'static', // ✅ Match adapter capabilities
});

Common Scenarios

Vercel Static vs Serverless

// For static sites
import vercel from '@astrojs/vercel/static';

export default defineConfig({
  output: 'static',
  adapter: vercel(),
});

// For SSR
import vercel from '@astrojs/vercel/serverless';

export default defineConfig({
  output: 'server',
  adapter: vercel(),
});

Server Routes Require SSR Adapter

---
// src/pages/api/data.ts
export const prerender = false;

export async function GET() {
  return new Response(JSON.stringify({ data: 'hello' }));
}
---
// ❌ Static adapter won't work
import vercel from '@astrojs/vercel/static';

// ✅ Use serverless adapter
import vercel from '@astrojs/vercel/serverless';

Hybrid Mode

// astro.config.mjs
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';

export default defineConfig({
  output: 'hybrid', // Static by default, SSR opt-in
  adapter: vercel(),
});
---
// Most pages are static
// Opt-in to SSR per page:
export const prerender = false;
---

Remove SSR Pages for Static Build

---
// If you need static output, ensure all pages can prerender

// ❌ This prevents static build
export const prerender = false;

// ✅ Remove or set to true
export const prerender = true; // or remove entirely
---

Check Adapter Documentation

// Different adapters have different capabilities

// @astrojs/vercel/static - Static only
// @astrojs/vercel/serverless - SSR support

// @astrojs/netlify - Both static and SSR

// @astrojs/node - SSR only (needs server)

// @astrojs/cloudflare - SSR with edge functions

Move Dynamic Logic to Client

---
// Instead of server-side data fetching
// export const prerender = false;
---

<div id="data"></div>

<script>
  // ✅ Fetch on client instead
  fetch('/api/data.json')
    .then(res => res.json())
    .then(data => {
      document.getElementById('data').textContent = JSON.stringify(data);
    });
</script>

Quick Checklist

  • Match output mode with adapter capabilities
  • Use serverless adapters for SSR
  • Use static adapters for static sites
  • Check if pages have prerender = false
  • Consider hybrid mode for mixed needs