Testing

File System Access API: Browser Support, Methods, Limits

The File System Access API works in Chrome 86+, Edge 86+, Opera 72+. Firefox and Safari ship only OPFS. Learn the methods, limits, and cross-browser quirks.

Author

Prince Dewani

May 5, 2026

The File System Access API is a WICG JavaScript API that lets web pages read and write files on a user's local disk through showOpenFilePicker, showSaveFilePicker, and showDirectoryPicker. It works in Chrome 86+, Edge 86+, and Opera 72+ on desktop, while Firefox and Safari support only the Origin Private File System and skip the local-disk pickers.

This guide covers what the File System Access API is, which browsers support it, the key methods, OPFS, support detection, and the known issues.

What is the File System Access API?

The File System Access API is a JavaScript API from the Web Platform Incubator Community Group at the W3C. It lets a web page open file and directory pickers, read existing files, and write new files directly to the user's local disk. The entry points are window.showOpenFilePicker, window.showSaveFilePicker, and window.showDirectoryPicker, with a separate sandboxed entry on navigator.storage.getDirectory.

Which browsers does the File System Access API support?

Chromium-based desktop browsers ship the local-disk picker methods, while Firefox, Safari, and mobile browsers skip them, so global picker usage sits around 27%. The Origin Private File System half ships much wider.

Loading browser compatibility data...

File System Access API compatibility in Chrome

Chrome supports the File System Access API picker methods from Chrome 86 on Windows, macOS, Linux, and ChromeOS. Chrome 74 to 85 had the methods disabled by default behind chrome://flags/#native-file-system-api. Chrome 4 to 73 did not support it. Chrome for Android exposes only the Origin Private File System, not the disk pickers.

File System Access API compatibility in Edge

Microsoft Edge supports the File System Access API from Edge 86 on Windows, macOS, and Linux. Edge 79 to 85 had the methods behind the Chromium experimental web platform features flag. Pre-Chromium EdgeHTML versions 12 to 79 never added the API.

File System Access API compatibility in Firefox

Firefox does not support the showOpenFilePicker, showSaveFilePicker, or showDirectoryPicker methods in any desktop or Android version. Mozilla flagged the local-disk pickers as harmful in its standards position. Firefox 111+ does ship the Origin Private File System through navigator.storage.getDirectory on Windows, macOS, Linux, and Android.

File System Access API compatibility in Safari

Safari does not support the File System Access API picker methods on macOS, iPadOS, or iOS in any version. WebKit ships only the Origin Private File System, available from Safari 15.2 on macOS Monterey, iPadOS 15.2, and iOS 15.2. There is no flag that turns the local-disk pickers on, and Apple has not committed to shipping them.

File System Access API compatibility in Opera

Opera supports the File System Access API picker methods from Opera 72 on Windows, macOS, and Linux, and tracks every Chromium release after that. Opera 62 to 71 had the methods disabled by default behind the same flag as Chrome. Opera Mobile and Opera Mini on Android and iOS do not expose the local-disk pickers.

File System Access API compatibility in Samsung Internet

Samsung Internet does not expose the File System Access API picker methods in any version on Galaxy phones or tablets. Samsung Internet is built on Chromium, but the Android port disables the pickers. The Origin Private File System ships in Samsung Internet 15+.

File System Access API compatibility in Android Browser

Chrome for Android, Firefox for Android, and the legacy stock Android Browser do not expose showOpenFilePicker, showSaveFilePicker, or showDirectoryPicker. Android lacks a system file picker that maps cleanly to the API surface. The Origin Private File System works on Chrome for Android 86+ and Firefox for Android 111+.

File System Access API compatibility in Internet Explorer

Internet Explorer does not support the File System Access API in any version. The API depends on Chromium and WebKit plumbing that Trident never had. Microsoft has retired Internet Explorer, so move file-picker work to Chromium-based Edge or Chrome.

Note

Note: The File System Access API breaks across Firefox, Safari, and every mobile browser. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!

What are the key methods of the File System Access API?

The File System Access API exposes three top-level Window methods for local-disk access, plus a separate entry point on navigator.storage for the Origin Private File System. Each picker returns a handle the page can read, write, or store for later.

  • window.showOpenFilePicker: Opens the system file dialog and returns an array of FileSystemFileHandle objects. The page reads the picked file with handle.getFile().
  • window.showSaveFilePicker: Prompts the user to pick a save location and filename, then returns a FileSystemFileHandle the page can write through createWritable().
  • window.showDirectoryPicker: Asks the user to pick a folder and returns a FileSystemDirectoryHandle that supports async iteration over its contents.
  • FileSystemWritableFileStream: The writable stream returned by createWritable. It supports write, seek, and truncate, and the file only lands on disk when the page calls close.
  • queryPermission and requestPermission: Per-handle permission gates. The page upgrades from read to readwrite without re-opening the picker.
  • navigator.storage.getDirectory: Entry point to the Origin Private File System. Returns a sandboxed FileSystemDirectoryHandle scoped to the page's origin, persistable across reloads in IndexedDB.

What is the Origin Private File System (OPFS)?

The Origin Private File System is a sandboxed storage tree that lives inside the browser, not on the user's visible disk. Every origin gets its own private root, which the page reads through navigator.storage.getDirectory.

OPFS is the part of the spec that ships in every modern engine. Chrome 86+, Edge 86+, Firefox 111+, and Safari 15.2+ all support it on desktop and mobile, including iOS where the local-disk pickers stay locked. Inside a Web Worker, OPFS exposes FileSystemSyncAccessHandle for synchronous random-access reads and writes, which lets compiled libraries like SQLite-on-the-web treat OPFS as a file descriptor.

  • Per-origin sandbox: Files in OPFS are invisible to other origins, other browsers, and the user's file manager. The browser can wipe them under storage pressure.
  • No user prompt: The first call to navigator.storage.getDirectory returns a handle without a picker dialog.
  • Sync access in workers: FileSystemSyncAccessHandle.read and write are blocking calls inside a Worker, which lets compiled libraries treat OPFS like a local file descriptor.
...

How do you check if a browser supports the File System Access API?

Feature-detect each picker method on the window object before you call it, and feature-detect navigator.storage.getDirectory separately for the Origin Private File System. Wrap the picker call in an if-block and ship a fallback for browsers that return undefined.

  • Open DevTools: Press F12 in Chrome, Edge, Opera, Firefox, or Safari, then switch to the Console tab.
  • Paste the snippet: Drop the JavaScript block below into the console and press Enter.
  • Read the output: A Chromium browser prints all three picker names. Firefox and Safari print the not-supported branch. Every modern engine prints OPFS available.
  • Wire a fallback: If pickers are missing, fall back to <input type="file"> for reads and the <a download> attribute or the GoogleChromeLabs/browser-fs-access library for writes.
  • Re-test on HTTPS: The pickers are SecureContext only. If the page is on plain HTTP, move it to HTTPS or http://localhost and run the snippet again.
// Paste this into the DevTools console to confirm File System Access API support.
const pickers = ["showOpenFilePicker", "showSaveFilePicker", "showDirectoryPicker"];
const supported = pickers.filter((method) => method in window);

if (supported.length === pickers.length) {
  console.log("File System Access API pickers available:", supported.join(", "));
} else if (supported.length > 0) {
  console.log("Partial support. Available:", supported.join(", "));
} else {
  console.log("File System Access API pickers are not supported in this browser.");
}

// Separate check for the Origin Private File System half of the API.
if (navigator.storage && "getDirectory" in navigator.storage) {
  console.log("OPFS is available via navigator.storage.getDirectory().");
} else {
  console.log("OPFS is not supported.");
}

If the pickers print as undefined on a Chromium browser, the page is on HTTP. Switch to HTTPS or http://localhost and the names appear on window.

What are the known issues with the File System Access API?

The File System Access API has a small desktop footprint and a long list of platform quirks once you ship it.

  • Firefox calls the pickers harmful: Mozilla published a harmful position on showOpenFilePicker, showSaveFilePicker, and showDirectoryPicker. Sites that need disk access on Firefox have to fall back to <input type="file"> for reads and <a download> for writes.
  • No pickers on Safari, iOS, or iPadOS: Safari ships only the Origin Private File System. iPhone and iPad visitors cannot pick a file or save to disk through the API in any version.
  • No pickers on Android: Chrome for Android, Firefox for Android, and Samsung Internet all skip the picker methods. Android web apps that need disk access ship a Trusted Web Activity or use OPFS.
  • Secure context only: Pickers throw TypeError on plain HTTP. The page must run on HTTPS or http://localhost or showOpenFilePicker is undefined on window.
  • User gesture required: The pickers need a user activation event such as a click. A call from setTimeout, fetch().then, or a load handler throws SecurityError.
  • Restricted folders: Chrome blocks the OS root, the Windows directory, the macOS Library, the user's home root, and other system folders. Picks inside them are silently rejected.
  • Permission rehydration: Handles stored in IndexedDB survive a page reload, but the page has to call requestPermission again to get write access. Read access stays granted only for the same browser session.

In my experience, the trickiest failure is permission rehydration after IndexedDB rehydrates a handle. Pages that store a directory handle for a project folder look like they still have access on reload, but the very first write throws NotAllowedError. Always re-prompt with requestPermission({ mode: "readwrite" }) on the next user click before you touch the file.

...

Citations

All File System Access API version numbers and platform notes in this guide come from these primary sources:

Author

Prince Dewani is a Community Contributor at TestMu AI, where he manages content strategies around software testing, QA, and test automation. He is certified in Selenium, Cypress, Playwright, Appium, Automation Testing, and KaneAI. Prince has also presented academic research at the international conference PBCON-01. He further specializes in on-page SEO, bridging marketing with core testing technologies. On LinkedIn, he is followed by 4,300+ QA engineers, developers, DevOps experts, tech leaders, and AI-focused practitioners in the global testing community.

Open in ChatGPT Icon

Open in ChatGPT

Open in Claude Icon

Open in Claude

Open in Perplexity Icon

Open in Perplexity

Open in Grok Icon

Open in Grok

Open in Gemini AI Icon

Open in Gemini AI

Copied to Clipboard!
...

3000+ Browsers. One Platform.

See exactly how your site performs everywhere.

Try it free
...

Write Tests in Plain English with KaneAI

Create, debug, and evolve tests using natural language.

Try for free

Frequently asked questions

Did you find this page helpful?

More Related Hubs

TestMu AI forEnterprise

Get access to solutions built on Enterprise
grade security, privacy, & compliance

  • Advanced access controls
  • Advanced data retention rules
  • Advanced Local Testing
  • Premium Support options
  • Early access to beta features
  • Private Slack Channel
  • Unlimited Manual Accessibility DevTools Tests