AI & Agents

File System Access API Limits: Browser Quotas, OPFS, and Large File Handling

The File System Access API allows web applications to read or save changes directly to files and folders on the user's device, subject to browser permission prompts and origin storage quota caps. While direct picker handles lack fixed file size caps, Origin Private File System storage is bounded by origin quotas. Handling large datasets requires quota inspection, worker-based sync access handles, and chunked streams to prevent memory bloat on files above 200 megabytes.

Tom Langridge 20 min read Updated
The File System Access API separates direct host disk handles from virtual Origin Private File System storage quotas.

How Direct Disk Handles Compare to the Origin Private File System

Chromium browsers like Chrome allocate up to 60% of total disk space per origin for storage, yet client-side web applications routinely crash long before reaching that boundary when developers attempt to manipulate large files in browser memory. The browser file system access api introduces desktop-class storage capabilities to web applications, but its practical operation is defined by two fundamentally different storage abstractions: direct host disk handles and the Origin Private File System (OPFS).

The File System Access API allows web applications to read or save changes directly to files and folders on the user's device, subject to browser permission prompts and origin storage quota caps. Understanding the operational boundaries of this API requires distinguishing between user-visible host files and origin-private sandbox storage.

Direct Disk Access Handles

Direct disk access relies on methods exposed on the global window object, specifically window.showOpenFilePicker() and window.showSaveFilePicker(). When an application invokes these methods, the browser presents the operating system's native file picker dialog (such as macOS Finder, Windows File Explorer, or Linux desktop file pickers).

Once a user selects a file or directory and confirms the dialog, the browser grants the web application a FileSystemFileHandle or FileSystemDirectoryHandle. Key operational characteristics include:

  • Host-Governed Storage Boundaries: There is no arbitrary browser file size limit applied to direct disk handles. A user can select an extensive multi-gigabyte video recording or a massive database snapshot, and the handle references that file directly on the host drive. The effective size limit is determined by the underlying file system format (such as NTFS, APFS, or ext4) and remaining physical drive capacity.
  • Explicit User Invocations: Every direct file picker invocation requires a transient user activation, such as a pointer click or keypress event. Web applications cannot silently pop up a file picker or read files in the background without explicit user interaction.
  • Session-Bound Permissions: File read permissions are granted upon selection, but write permissions require an additional explicit browser prompt (handle.requestPermission({ mode: 'readwrite' })). By default, write permissions expire when the browser tab or session closes, requiring the user to re-authorize write access in subsequent visits unless the origin holds persistent permission grants.
  • Platform Availability Constraints: Direct host disk pickers are currently supported in Chromium-based desktop browsers (Google Chrome, Microsoft Edge, Opera, and Brave). Apple Safari and Mozilla Firefox have declined to implement direct host picker methods due to security, fingerprinting, and sandboxing concerns.

Origin Private File System (OPFS)

The Origin Private File System provides an alternative, highly optimized storage endpoint accessed through navigator.storage.getDirectory(). Unlike direct disk handles, OPFS provides a private, virtualized directory structure isolated from the host desktop and hidden from the user.

Key characteristics of OPFS include:

  • Prompt-Free Execution: Because OPFS files are isolated inside the browser profile and inaccessible to other origins or host applications, opening, reading, creating, and modifying OPFS files requires zero permission dialogs.
  • Universal Modern Support: OPFS is supported across all major contemporary browsers, including Chrome, Apple Safari, and Mozilla Firefox. It functions across both desktop and mobile platforms.
  • Storage Quota Governance: Unlike direct disk handles, OPFS storage is pooled under the browser's unified Storage API. Every byte written into OPFS draws down the origin's storage quota alongside IndexedDB and the Cache API.
  • Eviction Risk: Unless an application explicitly secures persistent storage status, OPFS data remains best-effort storage. When the host operating system experiences severe disk pressure, or when a user clears website data and browsing history, the browser purges OPFS files.

The following evaluation table compares direct disk handles against OPFS across core operational dimensions:

Capability or Dimension Direct Disk Handles (showOpenFilePicker) Origin Private File System (OPFS)
Primary Entry Point window.showOpenFilePicker() navigator.storage.getDirectory()
User Permission Prompts Required on selection and write request Zero prompts; fully programmatic
Storage Allocation Limit Host file system and physical drive space Bounded by browser origin storage quota
Browser Compatibility Chromium desktop only (Chrome, Edge) Universal (Chrome, Safari, Firefox, mobile)
File Visibility User-visible in host desktop file manager Hidden inside private browser profile
Web Worker Access Read/write via asynchronous streams Synchronous access handles in dedicated workers
Persistence Model Durable on host disk until user deletes Best-effort unless flagged persistent via Storage API

Recognizing these boundaries determines how you architect data-heavy web applications. When an application needs to edit existing user files in place on desktop, direct picker handles provide the necessary bridge. When an application requires high-performance scratchpad storage, embedded databases, or client-side caching across all browsers, OPFS is the standard foundation.

How to Inspect Quotas with the StorageManager API

Because the Origin Private File System is governed by the browser's unified storage manager, applications writing substantial local datasets must monitor their storage footprint. Detailed in the web.dev guide to storage quotas, understanding origin private file system quota mechanics and opfs storage limits prevents abrupt runtime exceptions.

How Browsers Calculate Origin Storage Quotas

Browser vendors take differing approaches to calculating available storage pools and per-origin quotas. These differences reflect competing philosophies regarding privacy, disk usage, and device fingerprinting:

  • Chromium Engines (Chrome, Edge): Chrome allows the browser storage pool to consume up to 80% of total disk space on the partition containing the user profile. Within that global pool, an individual origin can use up to 60% of the total disk space. To prevent malicious trackers from fingerprinting devices by measuring exact available storage, Chrome deliberately returns a static quota calculation based on total disk size rather than fluctuating free space. Consequently, navigator.storage.estimate() can report a quota that technically exceeds current free physical space if the drive is nearly full.
  • Mozilla Firefox: Firefox calculates storage limits dynamically based on actual free disk space, allowing the browser to allocate up to half of available space while enforcing an origin group ceiling that adapts to host drive capacity.
  • Apple Safari (WebKit): Safari allocates an initial per-origin quota, prompting the user for approval to expand storage in discrete increments as consumption grows. On mobile Safari, home-screen Progressive Web Apps operate within dedicated containers where hitting the storage ceiling cannot be bypassed.

Inspecting Quotas with the StorageManager API

You should never hard-code storage assumptions into application logic. Instead, inspect current allocations programmatically using the StorageManager API before initiating large data operations.

The following production function queries the browser for current usage, total quota, and persistence state:

async function inspectStorageQuota() {
  if (!navigator.storage || !navigator.storage.estimate) {
    console.warn('StorageManager estimate API is not available.');
    return null;
  }
  try {
    const estimate = await navigator.storage.estimate();
    const usageBytes = estimate.usage || 0;
    const quotaBytes = estimate.quota || 0;
    const remainingBytes = Math.max(0, quotaBytes - usageBytes);
    const usageMB = (usageBytes / (1024 * 1024)).toFixed(2);
    const quotaMB = (quotaBytes / (1024 * 1024)).toFixed(2);
    const remainingMB = (remainingBytes / (1024 * 1024)).toFixed(2);
    const percentUsed = quotaBytes > 0 ? ((usageBytes / quotaBytes) * 100).toFixed(2) : '0.00';
    const isPersisted = navigator.storage.persist ? await navigator.storage.persisted() : false;
    console.log(`Storage Usage: ${usageMB} MB of ${quotaMB} MB`);
    console.log(`Remaining Capacity: ${remainingMB} MB`);
    console.log(`Storage Persistence Active: ${isPersisted}`);
    return {
      usageBytes,
      quotaBytes,
      remainingBytes,
      usageMB,
      quotaMB,
      remainingMB,
      percentUsed,
      isPersisted
    };
  } catch (error) {
    console.error('Failed to retrieve storage estimate:', error);
    throw error;
  }
}

Catching and Managing QuotaExceededError

When an application writes data that exceeds its allocated storage limit in OPFS, the browser halts the operation and throws a DOMException with the specific name QuotaExceededError (error code 22).

Failing to catch this error leads to uncaught promise rejections and corrupted state. Production file writers must wrap file modifications in structured exception blocks:

async function writeToOpfsFile(fileName, dataBuffer) {
  const root = await navigator.storage.getDirectory();
  const fileHandle = await root.getFileHandle(fileName, { create: true });
  const writable = await fileHandle.createWritable();
  try {
    await writable.write(dataBuffer);
    await writable.close();
  } catch (error) {
    await writable.abort();
    if (error.name === 'QuotaExceededError') {
      console.error(`Storage quota exceeded while writing ${fileName}. Initiating cleanup.`);
      await purgeTemporaryCache(root);
      throw new Error('Local browser storage quota exceeded. Please free local disk space.');
    }
    throw error;
  }
}

Securing Data with Persistent Storage Requests

By default, data stored in OPFS and IndexedDB is classified as best-effort storage. If the client device runs low on disk capacity, the browser's eviction algorithm will automatically delete stored data without prompting the user.

To protect critical databases, local cache indexes, and application state from automated eviction, web applications must call navigator.storage.persist(). This method requests that the browser register the origin as persistent storage:

async function requestStoragePersistence() {
  if (!navigator.storage || !navigator.storage.persist) {
    return false;
  }
  const alreadyPersisted = await navigator.storage.persisted();
  if (alreadyPersisted) {
    return true;
  }
  const granted = await navigator.storage.persist();
  if (granted) {
    console.log('Origin storage successfully registered as persistent.');
  } else {
    console.warn('Browser declined persistent storage request. Data remains subject to eviction.');
  }
  return granted;
}

In Chrome, persistent storage is granted automatically if the site meets specific heuristics, such as high user engagement, installation as a PWA, or notification permissions. In Firefox, the browser displays a permission prompt asking the user whether to grant persistent storage to the domain.

How to Prevent Browser Crashes on Large Files Above 200MB

While browser storage quotas define how much data an origin can persist on disk, client-side memory ceilings dictate whether a file operation succeeds or terminates in a catastrophic tab failure. Memory bloat occurs when files above 200 megabytes are written without chunked streams in writable streams.

The Mechanics of In-Memory Buffer Collapse

Modern desktop browsers run on high-performance JavaScript engines like V8 (Chrome, Edge), JavaScriptCore (Safari), and SpiderMonkey (Firefox). While 64-bit operating systems provide vast virtual address spaces, browser tabs enforce strict heap allocation ceilings, typically restricting the JavaScript heap to a few gigabytes per process.

When working with the File System Access API, developers frequently adopt naive reading and writing patterns:

// DANGEROUS PATTERN: Allocates entire file into V8 heap memory
const file = await fileHandle.getFile();
const buffer = await file.arrayBuffer(); // Rapid heap inflation
await writable.write(buffer);

Calling file.arrayBuffer() or file.text() on a large file forces the browser to allocate a contiguous block of RAM. For large media assets or extensive datasets, this operation triggers immediate memory bloat:

  1. Garbage Collection Pressure: Allocating large binary buffers triggers urgent, multi-generational garbage collection cycles, causing noticeable UI frame drops and freezing background execution.
  2. Intermediate Buffer Duplication: Converting, encoding, or passing large buffers through string serializers or intermediate blobs can double or triple the memory footprint in RAM.
  3. Tab Termination: Once memory allocations approach the process heap limit, the browser terminates the rendering process immediately, confronting the user with an unexpected out-of-memory crash (such as Chrome's Aw, Snap! Error code: Out of Memory).

Writing Multi-Gigabyte Files with Chunked Streams

To handle files exceeding 200 megabytes without stability issues, applications must stream data in small, discrete chunks using FileSystemWritableFileStream.

When you call fileHandle.createWritable(), the browser initializes an internal temporary swap file (such as .crswap in Chromium). As chunks are pushed through the stream, the browser writes them sequentially to disk rather than accumulating them in heap memory. Calling writable.close() atomically renames the temporary swap file to the target filename.

The following implementation demonstrates how to stream an external payload or local file in controlled chunks:

async function writeLargeFileInChunks(fileHandle, sourceStream, chunkSize = 1024 * 1024) {
  const writable = await fileHandle.createWritable();
  const reader = sourceStream.getReader();
  let bytesWritten = 0;
  try {
    while (true) {
      const { done, value } = await reader.read();
      if (done) {
        break;
      }
      await writable.write({
        type: 'write',
        position: bytesWritten,
        data: value
      });
      bytesWritten += value.byteLength;
    }
    await writable.close();
    console.log(`Stream complete. Wrote ${bytesWritten} bytes to disk.`);
    return bytesWritten;
  } catch (error) {
    await writable.abort(error);
    console.error('File stream aborted due to error:', error);
    throw error;
  } finally {
    reader.releaseLock();
  }
}

By decoupling transmission size from process memory, this streaming approach allows web applications to write massive multi-gigabyte files using only a few megabytes of active RAM.

High-Throughput Processing via Web Worker Sync Access Handles

While FileSystemWritableFileStream operates smoothly on the browser main thread, asynchronous promise overhead and microtask queue scheduling introduce latency bottlenecks for data-intensive processing tasks like client-side video transmuting, DuckDB analytics, or SQLite transactions.

To solve this, the Origin Private File System provides FileSystemSyncAccessHandle, accessible exclusively inside dedicated Web Workers. A sync access handle provides synchronous, non-blocking read() and write() operations that bypass the browser's asynchronous stream subsystem entirely.

The following Web Worker example demonstrates how to perform high-speed, in-place binary writes:

// Dedicated Web Worker Script (worker.js)
self.onmessage = async (event) => {
  const { fileName, totalRecords } = event.data;
  try {
    const root = await navigator.storage.getDirectory();
    const fileHandle = await root.getFileHandle(fileName, { create: true });
    const accessHandle = await fileHandle.createSyncAccessHandle();
    const bufferSize = 64 * 1024;
    const buffer = new Uint8Array(bufferSize);
    let fileOffset = 0;
    for (let i = 0; i < totalRecords; i++) {
      buffer.fill(i % 256);
      const written = accessHandle.write(buffer, { at: fileOffset });
      fileOffset += written;
    }
    accessHandle.flush();
    accessHandle.close();
    self.postMessage({ status: 'success', totalBytes: fileOffset });
  } catch (error) {
    self.postMessage({ status: 'error', message: error.message });
  }
};

Because createSyncAccessHandle() locks the target file exclusively while open, attempts to access the same file from multiple workers or threads will throw an exception until accessHandle.close() executes. This locking model guarantees consistency for embedded databases like SQLite WASM, enabling desktop-class query performance inside the browser sandbox.

Fastio features

Store and Query Large Agent Files Beyond Browser Limits

Connect AI agents and web apps to Fast.io workspaces over MCP. Store multi-gigabyte corpora, index documents for hybrid search, and bypass browser storage quotas. Monthly plans start with a 14-day free trial.

Why Safari and Firefox Limit the Browser File System Access API

Building software with the File System Access API requires understanding distinct platform support boundaries. While Chromium browsers embrace direct host disk manipulation, Apple Safari and Mozilla Firefox enforce alternative architectural patterns.

The Vendor Divide: Chromium vs WebKit and Gecko

The disparity in browser file system access api support stems from differing security and philosophical priorities among browser vendors:

  • Chromium (Google Chrome, Microsoft Edge): Google prioritizes web capabilities, aiming to enable complex productivity suites (such as video editors, IDEs, and 3D modeling tools) to replace native desktop applications. Chromium implements the full File System Access API specification, including showOpenFilePicker(), showSaveFilePicker(), showDirectoryPicker(), and directory tree enumeration.
  • Apple WebKit (Safari): Apple considers granting web applications direct, persistent handles to user desktop files a fundamental privacy and security risk. WebKit developers emphasize the danger of persistent handle hijacking, ransomware file tampering, and cross-origin file metadata tracking. Consequently, WebKit supports OPFS (navigator.storage.getDirectory()) and FileSystemSyncAccessHandle in Web Workers, but rejects showOpenFilePicker().
  • Mozilla Gecko (Firefox): Mozilla has officially marked direct host file pickers as negative on privacy and user safety grounds. Firefox engineers note that persistent directory handles expose sensitive directory layouts that can enable hardware and OS fingerprinting. Like Apple, Mozilla supports OPFS natively but leaves direct host pickers unsupported.

Understanding the showOpenFilePicker File Size Limit

Developers frequently search for the showopenfilepicker file size limit when designing file ingestion workflows. In Chromium environments where showOpenFilePicker() is available, the method itself imposes no artificial size ceiling.

The browser acts as an intermediary, passing the selected file reference from the operating system to the web execution context. The true constraints on file size are:

  1. Host Operating System and Disk Format: The host drive must support the file's scale. Legacy FAT32 file systems restrict individual files to four gigabytes, whereas modern formats like NTFS, APFS, and ext4 support multi-terabyte files.
  2. Buffer Management Strategy: As demonstrated in section three, attempting to read a multi-gigabyte file into a monolithic JavaScript buffer will trigger an out-of-memory crash. However, consuming the File object via file.slice() or file.stream() allows applications to process files of arbitrary scale.
  3. Transient Memory Ceilings: When writing changes back through showSaveFilePicker(), the destination drive must hold enough free capacity for both the temporary swap file and the finalized output.

Cross-Browser Fallback Pattern

To support users across Chrome, Safari, Firefox, and mobile browsers without duplicating core business logic, write an abstraction layer that tests for native API availability and falls back to standard HTML file inputs.

The following module provides an interface for reading files across all browsers:

async function openFileWithFallback(options = {}) {
  if (typeof window.showOpenFilePicker === 'function') {
    try {
      const pickerOptions = {
        multiple: options.multiple || false,
        types: options.types || []
      };
      const handles = await window.showOpenFilePicker(pickerOptions);
      const files = await Promise.all(handles.map(h => h.getFile()));
      return options.multiple ? files : files[0];
    } catch (error) {
      if (error.name === 'AbortError') {
        return null;
      }
      throw error;
    }
  }
  return new Promise((resolve) => {
    const input = document.createElement('input');
    input.type = 'file';
    input.multiple = options.multiple || false;
    input.style.display = 'none';
    if (options.accept) {
      input.accept = options.accept;
    }
    input.onchange = () => {
      const selectedFiles = Array.from(input.files || []);
      document.body.removeChild(input);
      resolve(options.multiple ? selectedFiles : selectedFiles[0] || null);
    };
    input.oncancel = () => {
      document.body.removeChild(input);
      resolve(null);
    };
    document.body.appendChild(input);
    input.click();
  });
}

For saving files, when window.showSaveFilePicker is unavailable, applications can fall back to creating an ephemeral object URL (URL.createObjectURL(blob)) and triggering a programmatic download via an anchor tag (<a download="filename">). While this approach requires re-downloading rather than editing in place, it keeps file exports functional across all platforms.

When to Offload Large Local Datasets to Persistent Cloud Workspaces

While the File System Access API and Origin Private File System solve local file storage within a single browser profile, local sandboxes create operational friction for modern distributed applications and collaborative AI agent pipelines.

The Limits of Client-Side Storage

Relying exclusively on browser-local storage introduces clear structural constraints:

  1. Isolation to a Single Device Profile: OPFS data is siloed within the specific browser profile on a single physical machine. A user switching from desktop Chrome to a mobile tablet, or opening an Incognito window, loses access to their local databases and cached files.
  2. Vulnerability to Eviction and Purging: Browser storage quotas remain best-effort unless granted persistence. Routine actions, such as clearing browser cookies, updating device storage settings, or running automated disk cleaners, permanently erase OPFS files.
  3. Agent Coordination Gaps: Autonomous AI agents, background batch runners, and team collaborators cannot inspect or query a user's local OPFS directory. If a developer uses tools like Claude Code, Codex, or server-side workflows, those agents require a shared, addressable workspace rather than an isolated browser sandbox.

Unifying Local Performance with Persistent Workspaces

To bridge this gap, modern engineering architectures combine the speed of local browser storage with persistent cloud workspaces. In this model, the web application uses OPFS as a high-speed local cache and scratchpad, while core project documents, media archives, and agent artifacts reside in shared, org-owned workspaces.

Fast.io provides this persistent storage layer for engineering teams and agentic workflows. Instead of leaving files trapped in isolated browser directories or struggling against browser memory ceilings, teams organize their assets into structured workspaces:

  • Durable Versioning and Access Controls: Every file stored in a Fast.io workspace maintains per-file version history, allowing teams and agents to restore previous versions and audit modifications over time. Granular permissions can be configured at the organization, workspace, folder, and file level.
  • Automated Intelligence and Hybrid Search: When Intelligence Mode is enabled on a workspace, files are indexed across full-text, semantic vectors, and metadata values. AI agents connect directly through the remote Model Context Protocol (MCP) server over Streamable HTTP at https://mcp.fast.io/mcp/tools.
  • Direct Querying Without Context Bloat: In AI agent workflows, similar ceilings appear at the application boundary: as documented by the Anthropic Help Center, Claude chat sessions accept up to 20 files at up to 500MB per file, while Claude Projects accept files up to 30MB each with no fixed file-count cap, bounded only by the model's context window. Instead of attaching gigabytes of raw files to an agent's context window or pushing multi-gigabyte payloads across browser connections, agents use MCP search actions to retrieve only the relevant document passages with source citations.
  • Cloud Import and Sync: Teams can pull assets into workspaces from existing cloud platforms without consuming local bandwidth via Fast.io cloud import. Cloud Sync supports Google Drive, Dropbox, Box, and OneDrive (including SharePoint libraries via OneDrive) on a schedule or on demand.

Straightforward Plans and Team Scaling

Fast.io structures pricing around clear organizational tiers with predictable limits. Monthly plans start with a 14-day free trial that requires a credit card. Paid subscriptions include Starter, Business, and Enterprise plans, providing team seats, dedicated storage, and credits for workspace intelligence:

Subscription Plan Monthly Rate Storage Capacity Team Seats Included AI Credits Maximum Upload Size
Starter $9.99 250 GB 3 seats 100,000 monthly 25 GB
Business $49.99 5 TB 10 seats 600,000 monthly 50 GB
Enterprise $199.99 25 TB 30 seats 3,000,000 monthly 100 GB

Credits meter AI actions like semantic search and document extraction. Storage overage beyond plan allotments is billed in money at 1.5 cents per gigabyte per month, with bandwidth overage at 4 cents per gigabyte.

By pairing local browser caching via OPFS with persistent, MCP-connected cloud workspaces on Fast.io, developers maintain high-performance client experiences while keeping team assets durable, searchable, and collaborative.

Sources

References used to verify factual claims in this guide.

  1. 1 web.dev: Storage for the web Accessed

    Chromium browsers like Chrome allocate up to 60% of total disk space per origin for storage.

  2. Claude chat sessions accept up to 20 files at up to 500MB per file, while Claude Projects accept files up to 30MB each with no fixed file-count cap, bounded only by the model's context window.

Frequently Asked Questions

What is the storage limit for the File System Access API?

The storage limit depends on whether you use direct disk handles or the Origin Private File System (OPFS). Direct disk handles obtained through showOpenFilePicker() have no browser-imposed file size limit; they are bounded only by the host operating system's file system format and physical disk capacity. In contrast, OPFS is governed by browser storage quotas. In Chromium browsers like Chrome, an origin can store up to 60% of total disk space in OPFS, while Firefox caps origin groups based on available disk space, and Safari allocates an initial pool before prompting for expansions.

Does the File System Access API work in Safari and Firefox?

The File System Access API works partially in Safari and Firefox. Both browsers fully support the Origin Private File System (OPFS) through navigator.storage.getDirectory(), as well as high-performance synchronous access handles in Web Workers via FileSystemSyncAccessHandle. However, neither Safari nor Firefox supports direct host disk pickers like showOpenFilePicker() or showSaveFilePicker(), citing security risks and device fingerprinting concerns. Applications targeting those browsers must fall back to standard HTML file inputs and anchor downloads.

How do you handle large files with the File System Access API without crashing the browser?

To handle files larger than 200 megabytes without exhausting browser memory, avoid reading entire files into JavaScript memory with methods like file.arrayBuffer() or file.text(). Instead, use FileSystemWritableFileStream to stream data in discrete chunks sequentially to disk. For data-intensive computing tasks like SQLite WASM or video processing, run operations inside a dedicated Web Worker and use FileSystemSyncAccessHandle for fast, in-place synchronous reading and writing.

What is the showOpenFilePicker file size limit on desktop operating systems?

There is no browser-enforced showOpenFilePicker file size limit. The picker allows users to select files of any size supported by their local operating system and disk partitioning format, such as multi-gigabyte video recordings or database dumps. The only constraints are host drive capacity and application memory handling: developers must stream large files in chunks rather than buffering the entire payload into RAM.

How do you persist Origin Private File System data against browser eviction?

By default, OPFS data is treated as best-effort storage and can be automatically cleared by the browser during low disk space conditions or when browser caches are purged. To protect data from automated eviction, call navigator.storage.persist(). If granted, the origin storage status transitions to persistent, ensuring the browser preserves OPFS files until the user explicitly clears site data.

Related Resources

Fastio features

Store and Query Large Agent Files Beyond Browser Limits

Connect AI agents and web apps to Fast.io workspaces over MCP. Store multi-gigabyte corpora, index documents for hybrid search, and bypass browser storage quotas. Monthly plans start with a 14-day free trial.