This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: tauri-v2-webview-low-memory-eviction-state-reconstruction-standard

Tauri 2.0 Webview Low-Memory Eviction State Reconstruction Standard

Mobile operating systems (iOS Jetsam, Android LMK) unilaterally terminate idle or memory-pressured webviews without triggering browser-standard unload events. In Tauri 2.0 mobile applications, engineers must bridge native lifecycle lifecycle hooks to serialize uncommitted UI transactions and navigation state into encrypted local storage via the Tauri Store plugin, guaranteeing zero-data-loss state rehydration upon cold webview reinitialization.

Prohibited Anti-Pattern: Relying on Window 'beforeunload' or Transient React State Leading to Mobile Eviction Data Loss

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Tauri 2.0 Webview Low-Memory Eviction State Reconstruction Standard - Mobile operating systems (iOS Jetsam, Android LMK) unilaterally terminate idle or memory-pressured webviews without triggering browser-standard unload events. In Tauri 2.0 mobile applications, engineers must bridge native lifecycle lifecycle hooks to serialize uncommitted UI transactions and navigation state into encrypted local storage via the Tauri Store plugin, guaranteeing zero-data-loss state rehydration upon cold webview reinitialization.
globs: src/**/*.{ts,tsx}, src-tauri/src/**/*.{rs}
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/tauri-v2-webview-low-memory-eviction-state-reconstruction-standard"
---

# Tauri 2.0 Webview Low-Memory Eviction State Reconstruction Standard

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Relying on Window 'beforeunload' or Transient React State Leading to Mobile Eviction Data Loss

## System Constraints
You are a Principal Mobile Architect enforcing the Tauri 2.0 Webview Low-Memory Eviction State Reconstruction Standard. On iOS and Android, webviews are aggressively culled by Jetsam and LMK daemon monitors. Standard web lifecycle events like 'beforeunload' and 'unload' are unreliable or ignored on mobile OS termination paths. You must mandate deterministic, debounced state snapshots to encrypted native storage on lifecycle background events, pairing frontend hooks with Tauri 2.0 AppHandle native lifecycle handlers for idempotent transaction reconstruction.

## Strict Guidelines
- Engineers MUST ALWAYS listen to Tauri native lifecycle change events ('tauri://lifecycle-change' or app pause events) rather than window 'beforeunload' or 'unload' for state preservation.
- Engineers MUST serialise all uncommitted form inputs, active transactional flow identifiers, and navigation stack positions into native secure storage (@tauri-apps/plugin-store or @tauri-apps/plugin-secure-storage) with a 300ms maximum debounce.
- Engineers MUST NOT execute asynchronous fetch operations or unbounded network promises inside teardown handlers, as the mobile OS halts execution instantly once backgrounded.
- Code MUST validate and deserialize saved state against a strict schema (e.g., Zod, ArkType) during application boot, discarding expired transactions (> 24 hours) to prevent stale state corruption.
- Services MUST clear the transient eviction cache immediately after a transaction is committed successfully to the database or remote backend.
- Components NEVER store sensitive uncommitted user data in plaintext LocalStorage or SessionStorage on mobile devices; hardware-backed or encrypted storage plugins are non-negotiable.

## Bad vs Good Implementations
### Handling Native Background Eviction via Tauri 2.0 Store Plugin

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Window lifecycle events like 'beforeunload' fail to trigger when iOS Jetsam or Android Low Memory Killer terminates the Webview process. Plaintext localStorage violates security baselines for financial or personal transaction data.
```typescript
import React, { useEffect, useState } from 'react';

export const CheckoutForm: React.FC = () => {
  const [transaction, setTransaction] = useState({ step: 1, cartId: '1234', notes: '' });

  // ANTI-PATTERN: beforeunload and unload are not guaranteed to fire on iOS/Android Webview termination
  useEffect(() => {
    const handleUnload = () => {
      localStorage.setItem('checkout_state', JSON.stringify(transaction));
    };
    window.addEventListener('beforeunload', handleUnload);
    return () => window.removeEventListener('beforeunload', handleUnload);
  }, [transaction]);

  return <input value={transaction.notes} onChange={e => setTransaction({...transaction, notes: e.target.value})} />;
};
```

#### Production Standard (Correct)
> **Standard**: Production invariant compliant implementation ensuring memory safety, deterministic execution, and zero runtime hallucination.
```typescript
import React, { useEffect, useRef } from 'react';
import { listen } from '@tauri-apps/api/event';
import { LazyStore } from '@tauri-apps/plugin-store';
import { z } from 'zod';

const TransactionStateSchema = z.object({
  step: z.number(),
  cartId: z.string().uuid(),
  notes: z.string().max(500),
  savedAt: z.number(),
});
type TransactionState = z.infer<typeof TransactionStateSchema>;

const store = new LazyStore('.app_recovery.bin', { autoSave: true });

export const useTransactionEvictionGuard = (state: TransactionState) => {
  const latestState = useRef<TransactionState>(state);
  latestState.current = state;

  useEffect(() => {
    const unlistenPromise = listen<{ state: 'paused' | 'resumed' }>('tauri://lifecycle-change', async (event) => {
      if (event.payload.state === 'paused') {
        // Synchronously trigger serialization to encrypted binary store upon backgrounding
        await store.set('checkout_snapshot', {
          ...latestState.current,
          savedAt: Date.now(),
        });
        await store.save();
      }
    });

    return () => {
      unlistenPromise.then((unlisten) => unlisten());
    };
  }, []);
};
```

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 Low-Memory Eviction State Reconstruction Standard

Tauri 2.0 Webview Low-Memory Eviction State Reconstruction Standard defines an industrial-grade behavioral standard for mobile engineering. Mobile operating systems (iOS Jetsam, Android LMK) unilaterally terminate idle or memory-pressured webviews without triggering browser-standard unload events. In Tauri 2.0 mobile applications, engineers must bridge native lifecycle lifecycle hooks to serialize uncommitted UI transactions and navigation state into encrypted local storage via the Tauri Store plugin, guaranteeing zero-data-loss state rehydration upon cold webview reinitialization. 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: Relying on Window 'beforeunload' or Transient React State Leading to Mobile Eviction Data Loss 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 DriftRelying on Window 'beforeunload' or Transient React State Leading to Mobile Eviction Data LossCritical
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 listen to Tauri native lifecycle change events ('tauri

Engineers MUST ALWAYS listen to Tauri native lifecycle change events ('tauri://lifecycle-change' or app pause events) rather than window 'beforeunload' or 'unload' for state preservation.

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 serialise all uncommitted form inputs, active transactional flow identifiers, and navigation stack positions into native secure storage (@tauri-apps/plugin-store or @tauri-apps/plugin-secure-storage) with a 300ms maximum debounce.

Engineers MUST serialise all uncommitted form inputs, active transactional flow identifiers, and navigation stack positions into native secure storage (@tauri-apps/plugin-store or @tauri-apps/plugin-secure-storage) with a 300ms maximum debounce.

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 NOT execute asynchronous fetch operations or unbounded network promises inside teardown handlers, as the mobile OS halts execution instantly once backgrounded.

Engineers MUST NOT execute asynchronous fetch operations or unbounded network promises inside teardown handlers, as the mobile OS halts execution instantly once backgrounded.

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

Code MUST validate and deserialize saved state against a strict schema (e.g., Zod, ArkType) during application boot, discarding expired transactions (> 24 hours) to prevent stale state corruption.

Code MUST validate and deserialize saved state against a strict schema (e.g., Zod, ArkType) during application boot, discarding expired transactions (> 24 hours) to prevent stale state corruption.

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

Services MUST clear the transient eviction cache immediately after a transaction is committed successfully to the database or remote backend.

Services MUST clear the transient eviction cache immediately after a transaction is committed successfully to the database or remote backend.

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.
6

Components NEVER store sensitive uncommitted user data in plaintext LocalStorage or SessionStorage on mobile devices

Components NEVER store sensitive uncommitted user data in plaintext LocalStorage or SessionStorage on mobile devices; hardware-backed or encrypted storage plugins are non-negotiable.

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 Low-Memory Eviction State Reconstruction Standard critical for AI coding assistants?

Mobile operating systems (iOS Jetsam, Android LMK) unilaterally terminate idle or memory-pressured webviews without triggering browser-standard unload events. In Tauri 2.0 mobile applications, engineers must bridge native lifecycle lifecycle hooks to serialize uncommitted UI transactions and navigation state into encrypted local storage via the Tauri Store plugin, guaranteeing zero-data-loss state rehydration upon cold webview reinitialization. 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 (Relying on Window 'beforeunload' or Transient React State Leading to Mobile Eviction Data Loss) 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