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.

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.
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.
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.
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.
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.
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.
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.
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.
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+.
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+.
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: 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!
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.
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.
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.
<input type="file"> for reads and the <a download> attribute or the GoogleChromeLabs/browser-fs-access library for writes.// 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.
The File System Access API has a small desktop footprint and a long list of platform quirks once you ship it.
<input type="file"> for reads and <a download> for writes.TypeError on plain HTTP. The page must run on HTTPS or http://localhost or showOpenFilePicker is undefined on window.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.
All File System Access API version numbers and platform notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance