This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: tauri2-webview-memory-quarantine-lifecycle-standard

Tauri 2.0 Webview Process Memory Quarantine and Lifecycle Teardown

Mandates strict multi-window process boundary isolation, explicit channel disposal, and deterministic teardown protocols across Tauri 2.0 desktop and mobile webviews. Prevents cross-webview state bleeding, lingering Rust-to-JS event listeners, and uncollected native-DOM bridge memory in suspended and closed webview instances.

Prohibited Anti-Pattern: Implicit Webview Destruction with Orphaned Rust Event Listeners and Leaked Native Process State

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Tauri 2.0 Webview Process Memory Quarantine and Lifecycle Teardown - Mandates strict multi-window process boundary isolation, explicit channel disposal, and deterministic teardown protocols across Tauri 2.0 desktop and mobile webviews. Prevents cross-webview state bleeding, lingering Rust-to-JS event listeners, and uncollected native-DOM bridge memory in suspended and closed webview instances.
globs: src/**/*.{ts,tsx}, src-tauri/src/**/*.rs
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/tauri2-webview-memory-quarantine-lifecycle-standard"
---

# Tauri 2.0 Webview Process Memory Quarantine and Lifecycle Teardown

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Implicit Webview Destruction with Orphaned Rust Event Listeners and Leaked Native Process State

## System Constraints
You are a Principal Engineer enforcing the Tauri 2.0 Webview Process Memory Quarantine and Lifecycle Standard. Mandate explicit webview destruction routines, scoped event listeners with deterministic unlisten calls, partitioned storage/cache directories between concurrent webviews, and defensive memory purging when navigating or destroying webview contexts on mobile and desktop platforms.

## Strict Guidelines
- Engineers MUST ALWAYS unregister all Tauri event listeners via the resolved UnlistenFn prior to window or webview destruction.
- Engineers MUST NOT rely on window closing or navigating away to trigger automatic garbage collection of native-to-webview IPC bridges or WebWorker threads.
- Code SHOULD isolate data and cache directories per WebviewWindow instance when managing multi-tenant or untrusted contexts.
- Services MUST abort all active Tauri IPC channels, event streams, and fetch AbortControllers during the 'tauri://destroyed' lifecycle event.
- Components NEVER store persistent native window references in unbounded global variables or module-level singletons without explicit nullification triggers on teardown.

## Bad vs Good Implementations
### Webview Event Lifecycle & Memory Teardown Protocol

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Fails to capture or execute the UnlistenFn returned by `listen()`, causing the Rust event bus to retain references to a deallocated webview context. Leaves memory reachable across reloads and leaks resources across mobile lifecycle transitions.
```typescript
import { listen } from '@tauri-apps/api/event';
import { getCurrentWebviewWindow } from '@tauri-apps/api/webviewWindow';

// ANTI-PATTERN: Leaks Rust-to-JS listener references and window bindings
export function setupLeakyMonitor() {
  const appWindow = getCurrentWebviewWindow();
  
  listen('heavy-telemetry-event', (event) => {
    console.log('Received payload:', event.payload);
    // Modifies global DOM and holds closures without teardown
    (window as any).__lastPayload = event.payload;
  });

  // Closing window without disposing native resources
  window.addEventListener('beforeunload', () => {
    appWindow.close();
  });
}
```

#### Production Standard (Correct)
> **Standard**: Properly tracks all UnlistenFn instances, guards async processing against aborted states using AbortController, hooks into 'tauri://destroyed', and deterministically tears down native-to-JS bridge connections to guarantee zero memory bleeding.
```typescript
import { listen, type UnlistenFn } from '@tauri-apps/api/event';
import { getCurrentWebviewWindow, type WebviewWindow } from '@tauri-apps/api/webviewWindow';

// PRODUCTION INVARIANT: Fully quarantined webview lifecycle controller
export class QuarantinedWebviewController {
  private readonly unlisteners: Set<UnlistenFn> = new Set();
  private readonly abortController = new AbortController();
  private webviewWindow: WebviewWindow | null = null;

  public async initialize(): Promise<void> {
    this.webviewWindow = getCurrentWebviewWindow();

    const unlistenTelemetry = await listen<Record<string, unknown>>(
      'heavy-telemetry-event',
      (event) => {
        if (this.abortController.signal.aborted) return;
        this.processPayload(event.payload);
      }
    );
    this.unlisteners.add(unlistenTelemetry);

    const unlistenDestroy = await this.webviewWindow.once(
      'tauri://destroyed',
      () => {
        void this.dispose();
      }
    );
    this.unlisteners.add(unlistenDestroy);
  }

  private processPayload(payload: Record<string, unknown>): void {
    // Scoped execution with no global attachment
    void payload;
  }

  public async dispose(): Promise<void> {
    this.abortController.abort();

    for (const unlisten of this.unlisteners) {
      try {
        unlisten();
      } catch (err) {
        console.error('Error invoking unlisten during teardown:', err);
      }
    }
    this.unlisteners.clear();

    // Explicit nullification to release heap retention
    this.webviewWindow = null;
  }
}
```

Recommended MCP Servers (mcp-serverlist.com)

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

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Tauri 2.0 Webview Process Memory Quarantine and Lifecycle Teardown

Tauri 2.0 Webview Process Memory Quarantine and Lifecycle Teardown defines an industrial-grade behavioral standard for mobile engineering. Mandates strict multi-window process boundary isolation, explicit channel disposal, and deterministic teardown protocols across Tauri 2.0 desktop and mobile webviews. Prevents cross-webview state bleeding, lingering Rust-to-JS event listeners, and uncollected native-DOM bridge memory in suspended and closed webview instances. 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: Implicit Webview Destruction with Orphaned Rust Event Listeners and Leaked Native Process State 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 DriftImplicit Webview Destruction with Orphaned Rust Event Listeners and Leaked Native Process StateCritical
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 unregister all Tauri event listeners via the resolved UnlistenFn prior to window or webview destruction.

Engineers MUST ALWAYS unregister all Tauri event listeners via the resolved UnlistenFn prior to window or webview destruction.

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 rely on window closing or navigating away to trigger automatic garbage collection of native-to-webview IPC bridges or WebWorker threads.

Engineers MUST NOT rely on window closing or navigating away to trigger automatic garbage collection of native-to-webview IPC bridges or WebWorker threads.

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

Code SHOULD isolate data and cache directories per WebviewWindow instance when managing multi-tenant or untrusted contexts.

Code SHOULD isolate data and cache directories per WebviewWindow instance when managing multi-tenant or untrusted contexts.

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

Services MUST abort all active Tauri IPC channels, event streams, and fetch AbortControllers during the 'tauri

Services MUST abort all active Tauri IPC channels, event streams, and fetch AbortControllers during the 'tauri://destroyed' lifecycle event.

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

Components NEVER store persistent native window references in unbounded global variables or module-level singletons without explicit nullification triggers on teardown.

Components NEVER store persistent native window references in unbounded global variables or module-level singletons without explicit nullification triggers on teardown.

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 Tauri 2.0 Webview Process Memory Quarantine and Lifecycle Teardown critical for AI coding assistants?

Mandates strict multi-window process boundary isolation, explicit channel disposal, and deterministic teardown protocols across Tauri 2.0 desktop and mobile webviews. Prevents cross-webview state bleeding, lingering Rust-to-JS event listeners, and uncollected native-DOM bridge memory in suspended and closed webview instances. 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 (Implicit Webview Destruction with Orphaned Rust Event Listeners and Leaked Native Process State) 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 MOBILE Rules

View all rules →
1 Rule in Stack

Tauri