nextcloud / nextcloud/desktop

Client repeatedly MKCOLs External Storage roots (405)

Open
#10,028 7 comments 0 reactions 0 assignees View on GitHub
1. to develop bug feature: :file_folder: file provider os: :apple: macOS
Dominant language
C++
Stars
3.9k
Forks
1k
Avg merge
1d 17h
Merged PRs (30d)
123

Description

### ⚠️ Before submitting, please verify the following: ⚠️

- [x] This is a **bug**, not a question or a configuration issue.
- [x] This issue is **not** already reported on Github (I have searched for it).
- [x] Nextcloud Server and Desktop Client are **up to date**. See [Server Maintenance and Release Schedule](https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule) and [Desktop Releases](https://nextcloud.com/install/#install-clients) for supported versions.
- [x] I agree to follow Nextcloud's [Code of Conduct](https://nextcloud.com/contribute/code-of-conduct/)

### Bug description

## ⚠️ Which version of the Nextcloud Desktop Client are you using?

`mirall/33.0.4` (latest stable, published 2026-05-04)

## What operating system is your client running on?

macOS (verified on macOS 26.4.1, Build 25E253, Apple Silicon)

## What server are you using?

Nextcloud server 33.0.2.2 (in Docker, official `nextcloud:33` image). Behavior is independent of server version — the 405 response is correct per WebDAV RFC 4918 §9.3.

## Affected feature

macOS Virtual Files (File Provider Extension) + External Storage mounts (type **Local**).

---

## Describe the bug

When Nextcloud Desktop Client (mirall) on macOS has Virtual Files enabled and the user's account contains one or more **External Storage** mounts (e.g. a `Local` storage type pointing to `/mnt/`), the desktop client periodically attempts to **create** those mount roots remotely via WebDAV `MKCOL`. The server correctly rejects each attempt with `405 Method Not Allowed` ("The resource you tried to create already exists") because External Storage roots exist server-side as virtual folders.

The client logs the failure:

```
[Item][error] Could not create new folder at:
https:///remote.php/dav/files//
received error: 405
The resource you tried to create already exists
```

This by itself appears harmless, but it is correlated with — and we believe causes — a **persistent enumeration failure** in the macOS FileProvider framework: items that should be top-level children of those External Storage roots remain unreachable from Finder, returning generic "you don't have permission to see its contents" or showing partial (wrong) child counts.

`fileproviderctl evaluate` confirms the items get latched with contradictory state (`isDownloaded=1` AND `isDownloading=1`, `isUploading=1` with `uploadingError=NSFileProviderErrorDomain Code=-2005`) that never clears.

The Apple `NSFileProviderItemIdentifier`s queried by macOS but not found by the NC FP extension correspond exactly to:
- The External Storage roots themselves (NC `oc_filecache.fileid` of each mount root)
- Their immediate top-level child folders

i.e. **the client's local Realm DB never registers External Storage roots or their top-level children**, but macOS's FileProvider framework remembers them from some prior state (working set discovery) and queries the FP extension for them repeatedly.

## Steps to reproduce

1. On a Nextcloud server, configure External Storage of type **Local** (or any backend) mounted at the top of a user's namespace, e.g. `/MyExtMount` → `/mnt/some/host/path`. Add some folders inside the mount.
2. On macOS, install Nextcloud Desktop Client and enable Virtual Files / File Provider integration.
3. Sign in with the user account that has access to `/MyExtMount`.
4. Wait ~30 min to a few hours.

## Expected result

- `/MyExtMount` appears as a normal folder in Finder under the Nextcloud FileProvider mount.
- Children of `/MyExtMount` enumerate correctly on demand.
- No `MKCOL` attempts on `/MyExtMount` (it already exists per the PROPFIND of the parent).

## Actual result

- Periodic `MKCOL /dav/files//MyExtMount` requests, every ~2-4 h.
- Each returns `405 Method Not Allowed` ("resource already exists").
- Each is logged as `Could not create new folder` at the Item level by the FP extension.
- macOS FP framework subsequently queries `NSFileProviderItemIdentifier`s for the mount root + top-level children that the FP extension cannot resolve.
- Finder access to subfolders below the mount root fails or shows partial/wrong enumeration.
- State **does not self-heal** across:
- NC.app restart
- Killing + relaunching FileProviderExt
- Renaming/deleting the FP domain group container (`~/Library/Group Containers/NKUJUXUJ3B.com.nextcloud.desktopclient/File Provider Domains//`), because macOS preserves item identifiers across same-UUID domain rebuilds.
- `fileproviderctl repair -a ` (fails with `FPCKDomain Code=65`).
- The only known workaround that clears the corrupted state is **Disconnect → Sign back in** in the NC Desktop GUI, which forces a new account UUID and therefore a new FP domain UUID — but the underlying bug then re-accumulates over hours.

## Server logs (relevant excerpts)

```
{"time":"2026-05-13T02:25:48+00:00","method":"MKCOL",
"url":"/nextcloud/remote.php/dav/files/chris/A",
"userAgent":"Mozilla/5.0 (Macintosh) mirall/33.0.4 (Nextcloud, …)",
"exception":{"Exception":"Sabre\\DAV\\Exception\\MethodNotAllowed",
"Message":"The resource you tried to create already exists"}}
```

Repeats 11 times over 24 h (most pairs are the same reqId logged twice; one pair is a fast retry +2 s with a different reqId).

## Client logs (relevant excerpts from `/Logs/*.jsonl`)

```
[Enumerator][info] Set up enumerator. url: https:///dav/files/
[Enumerator][info] No remote changes found in materialized items.
[Item ][error] Could not create new folder at:
https:///dav/files//A
received error: 405
The resource you tried to create already exists
[Enumerator][error] Could not find item with identifier.
(item: 00047556oc32b3i7gvmr)
[Enumerator][error] Could not find item with identifier.
(item: 00158151oc32b3i7gvmr)
```

24 h count: 24 `Could not create new folder` (~12 unique MKCOL attempts × 2 log lines each), 39 `Could not find item with identifier` (4 distinct item IDs, mapping exactly to External Storage roots + top-level children per NC's filecache).

## Server `oc_filecache` cross-reference

Querying NC server's database confirms the "missing" item IDs the client cannot resolve are real `fileid` entries belonging to External Storage mount roots and their top-level children:

```sql
mysql> SELECT fileid, storage, path, name FROM oc_filecache
WHERE fileid IN (47556, 158151, 158284, 252828);
+--------+---------+-------------------------+-------------------------+
| fileid | storage | path | name |
+--------+---------+-------------------------+-------------------------+
| 47556 | 4 | | | ← "A" ext-storage root
| 158151 | 6 | | | ← "B" ext-storage root
| 158284 | 6 | 200_X | 200_X |
| 252828 | 6 | Contact_Weekly_Reports | Contact_Weekly_Reports |
+--------+---------+-------------------------+-------------------------+

mysql> SELECT numeric_id, id FROM oc_storages
WHERE numeric_id IN (4, 6);
+------------+---------------------------+
| numeric_id | id |
+------------+---------------------------+
| 4 | local::/mnt/A/ |
| 6 | local::/mnt/B/ |
+------------+---------------------------+
```

The client *can* enumerate these via PROPFIND (we see them in Finder for a short window after fresh setup), but the FP extension does not appear to record them as `NSFileProviderItem`s in the local Realm DB.

## Suggested investigation directions for the maintainers

1. In the sync/discovery code path — likely `src/libsync/discoveryphase.cpp` and the propagator — verify that items with the `RemotePermissions::IsMounted` flag (`M` permission, indicating External Storage mount root) are correctly inserted into the client's Realm DB / `NSFileProviderItem` registry, not just enumerated.
2. Audit the path that emits `MKCOL` for any folder. Pre-flight check: does the parent's PROPFIND already include this child as a ``? If yes, **never emit `MKCOL`** — instead, materialize the existing item into the local registry.
3. Even if `MKCOL` fires and gets 405, the client should interpret 405 on a ``-confirmed existing path as **success** ("collection already exists"), perform a PROPFIND on the path, and register the resulting properties as a fresh `NSFileProviderItem`. Currently this code path appears to abort and log the 405 as an error without ever registering the item.
4. Specific to macOS: the FP framework's persistence of item identifiers across same-UUID domain rebuilds means that any client-side fix must also include a **migration path** for users currently stuck — clearing the FP framework's item cache requires either a new account UUID (full disconnect/reconnect) or an Apple-private mechanism we have not identified.

## Similar but distinct issues

Searched #1058, #4269, #4636, #7194, #8576, #8599, #9029, #9138, #9279, #11728, #17064 (server-side), #18637 (server-side), #19216 (server-side), #20236 (server-side), #53312 (server-side). None describes the exact MKCOL-on-existing-External-Storage-root pattern producing FP-framework item-ID orphans on macOS. The closest is #8576 (Windows endless re-sync of SMB external storage) which may share an underlying External Storage handling defect but presents differently (no MKCOL spec'd, Windows VFS).

## Environment

- Client: `mirall/33.0.4` (verified User-Agent)
- macOS: 26.4.1 (Build 25E253), Apple Silicon
- Server: Nextcloud 33.0.2.2, Docker (`nextcloud:33` image), MariaDB 11
- External Storage: `Local` backend, 2 mounts (`A` ~111 GB / 70k files, `B` ~13 GB / ~5k files)
- Network: Tailscale (not LAN-direct), but issue reproduces on LAN-direct (192.168.x.x) too

## Operator workaround in use

We have replaced the macOS FileProvider mount with a direct SMB mount over Tailscale for the affected External Storage paths. SMB does not exhibit this bug (it has no equivalent of the FP item-ID registry; it's a real network filesystem). This issue does not affect web UI, iOS clients, or non-FileProvider sync clients.

### Steps to reproduce

## ⚠️ Which version of the Nextcloud Desktop Client are you using?

`mirall/33.0.4` (latest stable, published 2026-05-04)

## What operating system is your client running on?

macOS (verified on macOS 26.4.1, Build 25E253, Apple Silicon)

## What server are you using?

Nextcloud server 33.0.2.2 (in Docker, official `nextcloud:33` image). Behavior is independent of server version — the 405 response is correct per WebDAV RFC 4918 §9.3.

## Affected feature

macOS Virtual Files (File Provider Extension) + External Storage mounts (type **Local**).

---

## Describe the bug

When Nextcloud Desktop Client (mirall) on macOS has Virtual Files enabled and the user's account contains one or more **External Storage** mounts (e.g. a `Local` storage type pointing to `/mnt/`), the desktop client periodically attempts to **create** those mount roots remotely via WebDAV `MKCOL`. The server correctly rejects each attempt with `405 Method Not Allowed` ("The resource you tried to create already exists") because External Storage roots exist server-side as virtual folders.

The client logs the failure:

```
[Item][error] Could not create new folder at:
https:///remote.php/dav/files//
received error: 405
The resource you tried to create already exists
```

This by itself appears harmless, but it is correlated with — and we believe causes — a **persistent enumeration failure** in the macOS FileProvider framework: items that should be top-level children of those External Storage roots remain unreachable from Finder, returning generic "you don't have permission to see its contents" or showing partial (wrong) child counts.

`fileproviderctl evaluate` confirms the items get latched with contradictory state (`isDownloaded=1` AND `isDownloading=1`, `isUploading=1` with `uploadingError=NSFileProviderErrorDomain Code=-2005`) that never clears.

The Apple `NSFileProviderItemIdentifier`s queried by macOS but not found by the NC FP extension correspond exactly to:
- The External Storage roots themselves (NC `oc_filecache.fileid` of each mount root)
- Their immediate top-level child folders

i.e. **the client's local Realm DB never registers External Storage roots or their top-level children**, but macOS's FileProvider framework remembers them from some prior state (working set discovery) and queries the FP extension for them repeatedly.

## Steps to reproduce

1. On a Nextcloud server, configure External Storage of type **Local** (or any backend) mounted at the top of a user's namespace, e.g. `/MyExtMount` → `/mnt/some/host/path`. Add some folders inside the mount.
2. On macOS, install Nextcloud Desktop Client and enable Virtual Files / File Provider integration.
3. Sign in with the user account that has access to `/MyExtMount`.
4. Wait ~30 min to a few hours.

## Expected result

- `/MyExtMount` appears as a normal folder in Finder under the Nextcloud FileProvider mount.
- Children of `/MyExtMount` enumerate correctly on demand.
- No `MKCOL` attempts on `/MyExtMount` (it already exists per the PROPFIND of the parent).

## Actual result

- Periodic `MKCOL /dav/files//MyExtMount` requests, every ~2-4 h.
- Each returns `405 Method Not Allowed` ("resource already exists").
- Each is logged as `Could not create new folder` at the Item level by the FP extension.
- macOS FP framework subsequently queries `NSFileProviderItemIdentifier`s for the mount root + top-level children that the FP extension cannot resolve.
- Finder access to subfolders below the mount root fails or shows partial/wrong enumeration.
- State **does not self-heal** across:
- NC.app restart
- Killing + relaunching FileProviderExt
- Renaming/deleting the FP domain group container (`~/Library/Group Containers/NKUJUXUJ3B.com.nextcloud.desktopclient/File Provider Domains//`), because macOS preserves item identifiers across same-UUID domain rebuilds.
- `fileproviderctl repair -a ` (fails with `FPCKDomain Code=65`).
- The only known workaround that clears the corrupted state is **Disconnect → Sign back in** in the NC Desktop GUI, which forces a new account UUID and therefore a new FP domain UUID — but the underlying bug then re-accumulates over hours.

## Server logs (relevant excerpts)

```
{"time":"2026-05-13T02:25:48+00:00","method":"MKCOL",
"url":"/nextcloud/remote.php/dav/files/chris/A",
"userAgent":"Mozilla/5.0 (Macintosh) mirall/33.0.4 (Nextcloud, …)",
"exception":{"Exception":"Sabre\\DAV\\Exception\\MethodNotAllowed",
"Message":"The resource you tried to create already exists"}}
```

Repeats 11 times over 24 h (most pairs are the same reqId logged twice; one pair is a fast retry +2 s with a different reqId).

## Client logs (relevant excerpts from `/Logs/*.jsonl`)

```
[Enumerator][info] Set up enumerator. url: https:///dav/files/
[Enumerator][info] No remote changes found in materialized items.
[Item ][error] Could not create new folder at:
https:///dav/files//A
received error: 405
The resource you tried to create already exists
[Enumerator][error] Could not find item with identifier.
(item: 00047556oc32b3i7gvmr)
[Enumerator][error] Could not find item with identifier.
(item: 00158151oc32b3i7gvmr)
```

24 h count: 24 `Could not create new folder` (~12 unique MKCOL attempts × 2 log lines each), 39 `Could not find item with identifier` (4 distinct item IDs, mapping exactly to External Storage roots + top-level children per NC's filecache).

## Server `oc_filecache` cross-reference

Querying NC server's database confirms the "missing" item IDs the client cannot resolve are real `fileid` entries belonging to External Storage mount roots and their top-level children:

```sql
mysql> SELECT fileid, storage, path, name FROM oc_filecache
WHERE fileid IN (47556, 158151, 158284, 252828);
+--------+---------+-------------------------+-------------------------+
| fileid | storage | path | name |
+--------+---------+-------------------------+-------------------------+
| 47556 | 4 | | | ← "A" ext-storage root
| 158151 | 6 | | | ← "B" ext-storage root
| 158284 | 6 | 200_FP&A | 200_FP&A |
| 252828 | 6 | Contact_Weekly_Reports | Contact_Weekly_Reports |
+--------+---------+-------------------------+-------------------------+

mysql> SELECT numeric_id, id FROM oc_storages
WHERE numeric_id IN (4, 6);
+------------+---------------------------+
| numeric_id | id |
+------------+---------------------------+
| 4 | local::/mnt/A/ |
| 6 | local::/mnt/B/ |
+------------+---------------------------+
```

The client *can* enumerate these via PROPFIND (we see them in Finder for a short window after fresh setup), but the FP extension does not appear to record them as `NSFileProviderItem`s in the local Realm DB.

## Suggested investigation directions for the maintainers

1. In the sync/discovery code path — likely `src/libsync/discoveryphase.cpp` and the propagator — verify that items with the `RemotePermissions::IsMounted` flag (`M` permission, indicating External Storage mount root) are correctly inserted into the client's Realm DB / `NSFileProviderItem` registry, not just enumerated.
2. Audit the path that emits `MKCOL` for any folder. Pre-flight check: does the parent's PROPFIND already include this child as a ``? If yes, **never emit `MKCOL`** — instead, materialize the existing item into the local registry.
3. Even if `MKCOL` fires and gets 405, the client should interpret 405 on a ``-confirmed existing path as **success** ("collection already exists"), perform a PROPFIND on the path, and register the resulting properties as a fresh `NSFileProviderItem`. Currently this code path appears to abort and log the 405 as an error without ever registering the item.
4. Specific to macOS: the FP framework's persistence of item identifiers across same-UUID domain rebuilds means that any client-side fix must also include a **migration path** for users currently stuck — clearing the FP framework's item cache requires either a new account UUID (full disconnect/reconnect) or an Apple-private mechanism we have not identified.

## Similar but distinct issues

Searched #1058, #4269, #4636, #7194, #8576, #8599, #9029, #9138, #9279, #11728, #17064 (server-side), #18637 (server-side), #19216 (server-side), #20236 (server-side), #53312 (server-side). None describes the exact MKCOL-on-existing-External-Storage-root pattern producing FP-framework item-ID orphans on macOS. The closest is #8576 (Windows endless re-sync of SMB external storage) which may share an underlying External Storage handling defect but presents differently (no MKCOL spec'd, Windows VFS).

## Environment

- Client: `mirall/33.0.4` (verified User-Agent)
- macOS: 26.4.1 (Build 25E253), Apple Silicon
- Server: Nextcloud 33.0.2.2, Docker (`nextcloud:33` image), MariaDB 11
- External Storage: `Local` backend, 2 mounts (`A` ~111 GB / 70k files, `B` ~13 GB / ~5k files)
- Network: Tailscale (not LAN-direct), but issue reproduces on LAN-direct (192.168.x.x) too

## Operator workaround in use

We have replaced the macOS FileProvider mount with a direct SMB mount over Tailscale for the affected External Storage paths. SMB does not exhibit this bug (it has no equivalent of the FP item-ID registry; it's a real network filesystem). This issue does not affect web UI, iOS clients, or non-FileProvider sync clients.

### Expected behavior

## ⚠️ Which version of the Nextcloud Desktop Client are you using?

`mirall/33.0.4` (latest stable, published 2026-05-04)

## What operating system is your client running on?

macOS (verified on macOS 26.4.1, Build 25E253, Apple Silicon)

## What server are you using?

Nextcloud server 33.0.2.2 (in Docker, official `nextcloud:33` image). Behavior is independent of server version — the 405 response is correct per WebDAV RFC 4918 §9.3.

## Affected feature

macOS Virtual Files (File Provider Extension) + External Storage mounts (type **Local**).

---

## Describe the bug

When Nextcloud Desktop Client (mirall) on macOS has Virtual Files enabled and the user's account contains one or more **External Storage** mounts (e.g. a `Local` storage type pointing to `/mnt/`), the desktop client periodically attempts to **create** those mount roots remotely via WebDAV `MKCOL`. The server correctly rejects each attempt with `405 Method Not Allowed` ("The resource you tried to create already exists") because External Storage roots exist server-side as virtual folders.

The client logs the failure:

```
[Item][error] Could not create new folder at:
https:///remote.php/dav/files//
received error: 405
The resource you tried to create already exists
```

This by itself appears harmless, but it is correlated with — and we believe causes — a **persistent enumeration failure** in the macOS FileProvider framework: items that should be top-level children of those External Storage roots remain unreachable from Finder, returning generic "you don't have permission to see its contents" or showing partial (wrong) child counts.

`fileproviderctl evaluate` confirms the items get latched with contradictory state (`isDownloaded=1` AND `isDownloading=1`, `isUploading=1` with `uploadingError=NSFileProviderErrorDomain Code=-2005`) that never clears.

The Apple `NSFileProviderItemIdentifier`s queried by macOS but not found by the NC FP extension correspond exactly to:
- The External Storage roots themselves (NC `oc_filecache.fileid` of each mount root)
- Their immediate top-level child folders

i.e. **the client's local Realm DB never registers External Storage roots or their top-level children**, but macOS's FileProvider framework remembers them from some prior state (working set discovery) and queries the FP extension for them repeatedly.

## Steps to reproduce

1. On a Nextcloud server, configure External Storage of type **Local** (or any backend) mounted at the top of a user's namespace, e.g. `/MyExtMount` → `/mnt/some/host/path`. Add some folders inside the mount.
2. On macOS, install Nextcloud Desktop Client and enable Virtual Files / File Provider integration.
3. Sign in with the user account that has access to `/MyExtMount`.
4. Wait ~30 min to a few hours.

## Expected result

- `/MyExtMount` appears as a normal folder in Finder under the Nextcloud FileProvider mount.
- Children of `/MyExtMount` enumerate correctly on demand.
- No `MKCOL` attempts on `/MyExtMount` (it already exists per the PROPFIND of the parent).

## Actual result

- Periodic `MKCOL /dav/files//MyExtMount` requests, every ~2-4 h.
- Each returns `405 Method Not Allowed` ("resource already exists").
- Each is logged as `Could not create new folder` at the Item level by the FP extension.
- macOS FP framework subsequently queries `NSFileProviderItemIdentifier`s for the mount root + top-level children that the FP extension cannot resolve.
- Finder access to subfolders below the mount root fails or shows partial/wrong enumeration.
- State **does not self-heal** across:
- NC.app restart
- Killing + relaunching FileProviderExt
- Renaming/deleting the FP domain group container (`~/Library/Group Containers/NKUJUXUJ3B.com.nextcloud.desktopclient/File Provider Domains//`), because macOS preserves item identifiers across same-UUID domain rebuilds.
- `fileproviderctl repair -a ` (fails with `FPCKDomain Code=65`).
- The only known workaround that clears the corrupted state is **Disconnect → Sign back in** in the NC Desktop GUI, which forces a new account UUID and therefore a new FP domain UUID — but the underlying bug then re-accumulates over hours.

## Server logs (relevant excerpts)

```
{"time":"2026-05-13T02:25:48+00:00","method":"MKCOL",
"url":"/nextcloud/remote.php/dav/files/chris/A",
"userAgent":"Mozilla/5.0 (Macintosh) mirall/33.0.4 (Nextcloud, …)",
"exception":{"Exception":"Sabre\\DAV\\Exception\\MethodNotAllowed",
"Message":"The resource you tried to create already exists"}}
```

Repeats 11 times over 24 h (most pairs are the same reqId logged twice; one pair is a fast retry +2 s with a different reqId).

## Client logs (relevant excerpts from `/Logs/*.jsonl`)

```
[Enumerator][info] Set up enumerator. url: https:///dav/files/
[Enumerator][info] No remote changes found in materialized items.
[Item ][error] Could not create new folder at:
https:///dav/files//A
received error: 405
The resource you tried to create already exists
[Enumerator][error] Could not find item with identifier.
(item: 00047556oc32b3i7gvmr)
[Enumerator][error] Could not find item with identifier.
(item: 00158151oc32b3i7gvmr)
```

24 h count: 24 `Could not create new folder` (~12 unique MKCOL attempts × 2 log lines each), 39 `Could not find item with identifier` (4 distinct item IDs, mapping exactly to External Storage roots + top-level children per NC's filecache).

## Server `oc_filecache` cross-reference

Querying NC server's database confirms the "missing" item IDs the client cannot resolve are real `fileid` entries belonging to External Storage mount roots and their top-level children:

```sql
mysql> SELECT fileid, storage, path, name FROM oc_filecache
WHERE fileid IN (47556, 158151, 158284, 252828);
+--------+---------+-------------------------+-------------------------+
| fileid | storage | path | name |
+--------+---------+-------------------------+-------------------------+
| 47556 | 4 | | | ← "A" ext-storage root
| 158151 | 6 | | | ← "B" ext-storage root
| 158284 | 6 | 200_X | 200_X |
| 252828 | 6 | Contact_Weekly_Reports | Contact_Weekly_Reports |
+--------+---------+-------------------------+-------------------------+

mysql> SELECT numeric_id, id FROM oc_storages
WHERE numeric_id IN (4, 6);
+------------+---------------------------+
| numeric_id | id |
+------------+---------------------------+
| 4 | local::/mnt/A/ |
| 6 | local::/mnt/B/ |
+------------+---------------------------+
```

The client *can* enumerate these via PROPFIND (we see them in Finder for a short window after fresh setup), but the FP extension does not appear to record them as `NSFileProviderItem`s in the local Realm DB.

## Suggested investigation directions for the maintainers

1. In the sync/discovery code path — likely `src/libsync/discoveryphase.cpp` and the propagator — verify that items with the `RemotePermissions::IsMounted` flag (`M` permission, indicating External Storage mount root) are correctly inserted into the client's Realm DB / `NSFileProviderItem` registry, not just enumerated.
2. Audit the path that emits `MKCOL` for any folder. Pre-flight check: does the parent's PROPFIND already include this child as a ``? If yes, **never emit `MKCOL`** — instead, materialize the existing item into the local registry.
3. Even if `MKCOL` fires and gets 405, the client should interpret 405 on a ``-confirmed existing path as **success** ("collection already exists"), perform a PROPFIND on the path, and register the resulting properties as a fresh `NSFileProviderItem`. Currently this code path appears to abort and log the 405 as an error without ever registering the item.
4. Specific to macOS: the FP framework's persistence of item identifiers across same-UUID domain rebuilds means that any client-side fix must also include a **migration path** for users currently stuck — clearing the FP framework's item cache requires either a new account UUID (full disconnect/reconnect) or an Apple-private mechanism we have not identified.

## Similar but distinct issues

Searched #1058, #4269, #4636, #7194, #8576, #8599, #9029, #9138, #9279, #11728, #17064 (server-side), #18637 (server-side), #19216 (server-side), #20236 (server-side), #53312 (server-side). None describes the exact MKCOL-on-existing-External-Storage-root pattern producing FP-framework item-ID orphans on macOS. The closest is #8576 (Windows endless re-sync of SMB external storage) which may share an underlying External Storage handling defect but presents differently (no MKCOL spec'd, Windows VFS).

## Environment

- Client: `mirall/33.0.4` (verified User-Agent)
- macOS: 26.4.1 (Build 25E253), Apple Silicon
- Server: Nextcloud 33.0.2.2, Docker (`nextcloud:33` image), MariaDB 11
- External Storage: `Local` backend, 2 mounts (`A` ~111 GB / 70k files, `B` ~13 GB / ~5k files)
- Network: Tailscale (not LAN-direct), but issue reproduces on LAN-direct (192.168.x.x) too

## Operator workaround in use

We have replaced the macOS FileProvider mount with a direct SMB mount over Tailscale for the affected External Storage paths. SMB does not exhibit this bug (it has no equivalent of the FP item-ID registry; it's a real network filesystem). This issue does not affect web UI, iOS clients, or non-FileProvider sync clients.

### Which files are affected by this bug

All

### Operating system

macOS

### Which version of the operating system you are running.

MacOS 26.4.1

### Installation method

Official Linux AppImage

### Nextcloud Server version

33.0.4

### Nextcloud Desktop Client version

33.0.4

### Did this occur after an update or on a clean installation?

Clean desktop client installation

### Are you using the Nextcloud Server Encryption module?

No

### Are you using an external user-backend?

- [ ] Default internal user-backend
- [ ] LDAP or Active Directory
- [ ] SSO - SAML
- [x] Other

### Nextcloud Server logs

```shell

```

### Additional info

[debug_archive.zip](https://github.com/user-attachments/files/27755343/debug_archive.zip)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.