> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mirage.strukto.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Support Matrix

> Which OS and SDK combinations support MIRAGE FUSE mounts, and how well.

FUSE mode exposes a mount as a real OS directory so any tool (editors,
sandbox runtimes, plain `cat`) can read it, not just MIRAGE commands. OS
support depends on the SDK's FUSE binding: Python uses
[mfusepy](https://github.com/mxmlnkn/mfusepy) (ctypes over libfuse), Node
uses [@zkochan/fuse-native](https://www.npmjs.com/package/@zkochan/fuse-native)
(a native addon), and browsers cannot mount filesystems at all.

## Matrix

| OS      | Python                | TypeScript (Node)     | Notes                                                            |
| ------- | --------------------- | --------------------- | ---------------------------------------------------------------- |
| Linux   | ✅ supported, CI-gated | ✅ supported, CI-gated | `fuse3`; multiple mounts per process                             |
| macOS   | ✅ supported           | ✅ supported           | macFUSE kernel extension; **one mount per process**              |
| Windows | 🧪 experimental       | ❌ not supported       | Python via [WinFsp](/home/setup/windows); advisory CI job passes |
| Browser | ❌                     | ❌                     | no kernel; use the virtual executor instead                      |

Per-OS install guides: [macOS](/home/setup/macos), [Linux](/home/setup/linux),
[Windows](/home/setup/windows). SDK wiring:
[Python FUSE setup](/python/setup/fuse),
[TypeScript FUSE setup](/typescript/setup/fuse).

## What the labels mean

* **Supported, CI-gated (Linux).** The FUSE integration battery (both SDKs,
  real kernel mounts, including size-unknown API files) runs on every change
  and gates merges.
* **Supported (macOS).** Same code paths, verified on real macFUSE kext
  mounts; hosted CI runners cannot approve kernel extensions, so macOS
  coverage is local rather than gated. Remember the one-mount-per-process
  limit.
* **Experimental (Windows, Python only).** The full battery passes over
  WinFsp in an advisory CI job (not merge-gating). Windows conventions
  (unmount at process exit, mount-level ownership, stat-opens-a-handle) are
  documented on the [Windows page](/home/setup/windows). Write-heavy flows
  and symlinks are not yet exercised there.
* **Not supported (Windows, TypeScript).** `@zkochan/fuse-native` only
  targets macOS and Linux; its legacy Windows path builds against the
  unmaintained Dokany-based `fuse-shared-library-win32` rather than WinFsp.

## Platform quirks at a glance

| Quirk                       | Linux                          | macOS                             | Windows                           |
| --------------------------- | ------------------------------ | --------------------------------- | --------------------------------- |
| Mounts per process          | many                           | **one** (Python and Node)         | many                              |
| Unmount                     | `fusermount -u` / `ws.close()` | `diskutil unmount` / `ws.close()` | at process exit only              |
| Size-unknown files pre-open | stat 0                         | stat 0                            | stat fetches, shows real size     |
| Mountpoint directory        | must exist                     | must exist                        | must **not** exist (auto-created) |

The size-unknown semantics themselves (stat 0 until open, full content on
read, real size after open) are identical across SDKs; see
[Python](/python/setup/fuse#size-semantics-for-api-backed-files) or
[TypeScript](/typescript/limitations#3-size-unknown-api-files-stat-as-0-bytes-until-first-open)
for the per-tool table.
