This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
frontendcritical PriorityID: nuxt4-nitro-shared-ssr-state-guardrail

Nuxt 4 Nitro Server Engine Isolation and Shared Directory Hydration Standard

Enforces strict isolation between Nitro v2 server execution contexts, the Nuxt 4 `app/` client directory, and the root `shared/` directory. Prevents catastrophic cross-request state pollution in Node/Worker runtimes and guarantees deterministic SSR hydration by eliminating global mutable singletons and unauthorized server import leakage.

Prohibited Anti-Pattern: Global Module-Level State Pollution and Illegal Server-Client Import Leaks in Nuxt 4

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Nuxt 4 Nitro Server Engine Isolation and Shared Directory Hydration Standard - Enforces strict isolation between Nitro v2 server execution contexts, the Nuxt 4 `app/` client directory, and the root `shared/` directory. Prevents catastrophic cross-request state pollution in Node/Worker runtimes and guarantees deterministic SSR hydration by eliminating global mutable singletons and unauthorized server import leakage.
globs: app/**/*.{ts,vue}, server/**/*.{ts,js}, shared/**/*.{ts,js}, nuxt.config.ts
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/nuxt4-nitro-shared-ssr-state-guardrail"
---

# Nuxt 4 Nitro Server Engine Isolation and Shared Directory Hydration Standard

> **Severity**: CRITICAL | **Category**: frontend
> **Anti-Pattern Warning**: Global Module-Level State Pollution and Illegal Server-Client Import Leaks in Nuxt 4

## System Constraints
You are a Principal Software Architect enforcing production standards for Nuxt 4, Nitro v2, and shared hydration boundaries. You must prohibit global mutable module variables in Nitro server routes, prevent client-side imports of server-only modules, enforce Nuxt 4 `app/` directory nesting, and mandate request-scoped state handling via `useState` or `event.context` to eliminate cross-tenant data leaks and hydration mismatches.

## Strict Guidelines
- Engineers MUST ALWAYS isolate request-scoped state in Nitro handlers using `event.context` or local handler scopes, NEVER module-scoped top-level variables.
- Engineers MUST NOT import files from `server/` into the `app/` directory or non-server contexts; shared logic must strictly reside in `shared/` as stateless utilities or schema definitions.
- Engineers MUST ensure code located in `shared/` is purely isomorphic, zero-side-effect, and does not retain runtime execution state across SSR requests.
- Engineers MUST ALWAYS initialize client/SSR shared reactive state using `useState('uniqueKey', () => initVal)` instead of bare Vue `ref()` or `reactive()` outside setup scopes.
- Nitro server routes MUST return serializable JSON-compatible data and avoid returning raw internal class instances, cyclic object structures, or native Node streams unhandled.

## Bad vs Good Implementations
### Prevent Cross-Request State Pollution in Nitro v2 Event Handlers

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Top-level variables in Nitro server routes remain resident in memory across requests in long-lived runtimes (Node.js, Cloudflare Workers). Mutating `currentSession` introduces a critical data leak across different client requests (tenant cross-contamination).
```typescript
// server/api/user/session.ts - CRITICAL BUG: Module-level mutable state leaks across concurrent user requests
import { defineEventHandler, getQuery } from 'h3';

interface SessionState {
  userId: string | null;
  isAuthenticated: boolean;
}

// Module-scoped variable shared across ALL requests in persistent Node/Worker runtimes
const currentSession: SessionState = {
  userId: null,
  isAuthenticated: false
};

export default defineEventHandler((event) => {
  const query = getQuery(event);
  if (query.userId) {
    currentSession.userId = query.userId as string;
    currentSession.isAuthenticated = true;
  }
  // Returns session belonging to whoever called this route last!
  return { session: currentSession };
});
```

#### Production Standard (Correct)
> **Standard**: State is instantiated purely within the request handler invocation scope or attached to `event.context`. It is completely garbage-collected upon response completion and cannot leak across requests.
```typescript
// server/api/user/session.ts - SAFE: Scoped directly to the H3Event execution context
import { defineEventHandler, getQuery, createError } from 'h3';

interface SessionState {
  userId: string | null;
  isAuthenticated: boolean;
}

export default defineEventHandler((event) => {
  const query = getQuery(event);
  
  // State is localized strictly to this individual request lifecycle
  const requestSession: SessionState = {
    userId: typeof query.userId === 'string' ? query.userId : null,
    isAuthenticated: typeof query.userId === 'string'
  };

  // Stash in H3 context if downstream Nitro middleware needs access
  event.context.session = requestSession;

  return {
    session: requestSession
  };
});
```

### Nuxt 4 app/ Hydration Safe State vs Module-Level SSR Poisoning

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Declaring a `ref()` or `reactive()` outside of a composable function causes it to exist globally in the Node.js server process, sharing that state across all visitors and causing mismatched DOM hydration on the client.
```typescript
// app/composables/useUserProfile.ts - CRITICAL BUG: Bare reactive outside setup leaks across SSR requests
import { ref } from 'vue';
import type { UserProfile } from '~~/shared/types';

// Leaks SSR state across requests and creates hydration mismatches
const globalProfile = ref<UserProfile | null>(null);

export const useUserProfile = () => {
  const setProfile = (profile: UserProfile) => {
    globalProfile.value = profile;
  };
  return { profile: globalProfile, setProfile };
};
```

#### Production Standard (Correct)
> **Standard**: `useState` ties the reactive reference to the active Nuxt application instance. It serializes properly into the SSR hydration payload (`__NUXT__`) and isolates memory per request on the server.
```typescript
// app/composables/useUserProfile.ts - SAFE: Nuxt 4 SSR request-isolated hydration state
import type { UserProfile } from '~~/shared/types';

export const useUserProfile = () => {
  // useState binds state to NuxtApp context, safe for SSR payload serialization
  const profile = useState<UserProfile | null>('user-profile-key', () => null);

  const setProfile = (data: UserProfile) => {
    profile.value = data;
  };

  return {
    profile,
    setProfile
  };
};
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Nuxt 4 Nitro Server Engine Isolation and Shared Directory Hydration Standard

Nuxt 4 Nitro Server Engine Isolation and Shared Directory Hydration Standard defines an industrial-grade behavioral standard for frontend engineering. Enforces strict isolation between Nitro v2 server execution contexts, the Nuxt 4 `app/` client directory, and the root `shared/` directory. Prevents catastrophic cross-request state pollution in Node/Worker runtimes and guarantees deterministic SSR hydration by eliminating global mutable singletons and unauthorized server import leakage. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Global Module-Level State Pollution and Illegal Server-Client Import Leaks in Nuxt 4 Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftGlobal Module-Level State Pollution and Illegal Server-Client Import Leaks in Nuxt 4Critical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS isolate request-scoped state in Nitro handlers using `event.context` or local handler scopes, NEVER module-scoped top-level variables.

Engineers MUST ALWAYS isolate request-scoped state in Nitro handlers using `event.context` or local handler scopes, NEVER module-scoped top-level variables.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT import files from `server/` into the `app/` directory or non-server contexts

Engineers MUST NOT import files from `server/` into the `app/` directory or non-server contexts; shared logic must strictly reside in `shared/` as stateless utilities or schema definitions.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Engineers MUST ensure code located in `shared/` is purely isomorphic, zero-side-effect, and does not retain runtime execution state across SSR requests.

Engineers MUST ensure code located in `shared/` is purely isomorphic, zero-side-effect, and does not retain runtime execution state across SSR requests.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Engineers MUST ALWAYS initialize client/SSR shared reactive state using `useState('uniqueKey', () => initVal)` instead of bare Vue `ref()` or `reactive()` outside setup scopes.

Engineers MUST ALWAYS initialize client/SSR shared reactive state using `useState('uniqueKey', () => initVal)` instead of bare Vue `ref()` or `reactive()` outside setup scopes.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Nitro server routes MUST return serializable JSON-compatible data and avoid returning raw internal class instances, cyclic object structures, or native Node streams unhandled.

Nitro server routes MUST return serializable JSON-compatible data and avoid returning raw internal class instances, cyclic object structures, or native Node streams unhandled.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is Nuxt 4 Nitro Server Engine Isolation and Shared Directory Hydration Standard critical for AI coding assistants?

Enforces strict isolation between Nitro v2 server execution contexts, the Nuxt 4 `app/` client directory, and the root `shared/` directory. Prevents catastrophic cross-request state pollution in Node/Worker runtimes and guarantees deterministic SSR hydration by eliminating global mutable singletons and unauthorized server import leakage. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Global Module-Level State Pollution and Illegal Server-Client Import Leaks in Nuxt 4) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

Related FRONTEND Rules

View all rules →
frontend
119

SolidStart 1.0 Server Functions & Async Boundaries Production Standard

SolidStart 1.0 relies on the Vinxi bundler to split `server$` closures into independent HTTP POST RPC endpoints. Direct lexical closure over client signals within `server$` scopes or failure to demarcate async boundaries with `<Suspense>` causes silent serialization failures, client-bundle secret leaks, and SSR hydration mismatches. Enforcing strict parameter passing, runtime input validation, and Solid async primitives maintains security and fine-grained reactivity across network boundaries.

frontend
119

Astro 5 Actions & Content Layer Production Standard

Enforces strict type safety and architectural correctness for Astro 5 Server Actions and the zero-waterfall Content Layer API. Prevents runtime contract mismatches, hydration mismatches, and unhandled mutation exceptions across dynamic and prerendered boundaries. Failure to follow these patterns leads to silent data fetching waterfalls, build-time cache corruptions, and unhandled server action exceptions.

frontend
51

Nuxt 4 Nitro Server Engine & Shared Directory Production Standard

Nuxt 4 enforces strict boundary segregation between client UI in the app/ directory, backend endpoints in server/, and universal contracts in shared/. Violating cross-boundary isolation or maintaining module-scoped state in Nitro server handlers causes catastrophic cross-request data corruption and hydration mismatches under concurrent production traffic. Architects must enforce request-isolated H3 event contexts, universal serialization schemas, and strict path-alias boundaries.

1 Rule in Stack

Nuxt