Known limitations

Behaviour that is understood, reproducible and not fixed yet. Every entry says what you see, why the software behaves that way, and what removing the limitation would take — including the cases where the desktop offers no cooperative way out and the answer has to come from the filesystem itself.

This page is deliberately separate from its neighbours: the Roadmap says what is planned, and Diagnose a problem answers "my mount is broken, what now?". Nothing here is broken — it is the current shape of the product, stated plainly so nobody has to rediscover it.

cache clear <path> refuses while the account is mounted

$ wusel cache clear Photos/Birdie.jpg
Error: account 'default' is currently mounted at /home/you/Wusel — unmount
first (`wusel service disable` or stop the running `wusel mount`)

The guard is unconditional: it refuses the same way whether you clear the whole account or one path below it.

For the whole account that is necessary. A full clear deletes the state database and the blob cache directory outright, and a running daemon holds both open — removing them under a live mount pulls the session’s ground out from under it.

For a single path there is no such reason. Dropping the cached content of one file, or forgetting one subtree’s metadata, is an ordinary write to structures the daemon writes to all day; it has one writer and a collision policy for exactly this (Concurrency). The command refuses because of where the work happens, not what it is: cache clear does it itself, in the CLI process, opening the account’s database from a second process. The blunt guard is what keeps that second writer out of the daemon’s way.

Removing the limitation needs no new machinery. The daemon already answers a per-user socket — that is how wusel status and wusel doctor ask it what it is doing. A per-path clear handed over that socket would run inside the daemon, where it is just another write, and the mount could stay up; the file’s emblem would fall back to online-only as the eviction lands.

Until then, stop the account for the moment it takes:

systemctl --user stop wusel@default
wusel cache clear Photos/Birdie.jpg
systemctl --user start wusel@default

wusel unpin is unaffected and works on a live mount — but it only releases a file for eviction, it does not free the space now.

A preview or an indexer can pull whole files down

Open a folder of large, never-opened documents in the file manager and the cache fills with files nobody asked for: du -sh ~/.cache/wusel grows, emblems flip from online-only to cached by themselves, and the traffic is real. PDFs are the clearest case, because rendering a thumbnail means parsing the document.

Why it happens. A VFS has exactly one signal for "the user wants this file": reads. Wusel tallies what has been read per file, and once a file is read past a floor of half a megabyte it stops serving bytes piecemeal and caches the whole file in the background. That threshold is what makes an ordinary open cheap (a MIME sniff of a few kilobytes never triggers it) and reliable (a real open crosses it at once, so the file is cached on the first open). A thumbnailer is indistinguishable from a person at this level: it opens the file and reads it, and for a PDF it reads well past the floor. The download is correct by the rule and wrong by intent.

Why the desktop cannot simply be asked. Verified on a live mount under GNOME 50 / glib 2.88: GIO reports filesystem::type: fuse and filesystem::remote: FALSE — a FUSE mount is local as far as the desktop is concerned. The one attribute that would say otherwise, filesystem::use-preview, is never delivered by the local GIO backend; only GVfs backends set it, and a kernel mount is not one. So Nautilus’s own "thumbnails for local files only" setting counts us as local, and an extension cannot decline on our behalf either: libnautilus-extension offers info, menu, column and property-page providers, and nothing that vetoes a preview. There is no cooperative channel — the decision can only be made in the filesystem.

What a fix would have to do. The filesystem knows which process is calling. A file opened by a process that is recognisably a previewer or an indexer can be refused instead of fetched, while anything already on local disk keeps opening as before. That makes Wusel judge callers by name, which is a heuristic and a policy — so it belongs in the configuration, not in silent built-in behaviour. It also has a price worth knowing in advance: GNOME records a failed thumbnailer run and does not retry it until the file’s timestamp or size changes, so a file that is pinned later can keep a generic icon until that record is cleared (rm -rf ~/.cache/thumbnails/fail/gnome-thumbnail-factory).

Today, only the indexer half has an answer: [desktop] exclude_from_indexers (on by default) makes the mount serve synthetic .trackerignore / .nomedia markers that GNOME Tracker/LocalSearch honour — see File states. Previews are not covered by it. Turning thumbnails off in the file manager works, but it is a global setting; there is no per-folder scope for it.

df reports a stand-in size when the account has no quota

$ df -h ~/Wusel
Filesystem      Size  Used Avail Use% Mounted on
wusel           1.0P  586M  1.0P   1% /home/you/Wusel

The used figure is real. The 1 PiB is not: it stands for "free space unknown", and it appears whenever the server names no limit for the account.

Why it happens. Wusel asks the server for the account’s quota (the WebDAV properties quota-used-bytes and quota-available-bytes). An account with no quota configured gets a truthful used figure and -3 for the available one — Nextcloud’s sentinel for "unlimited". There are two more, -1 for "not yet computed" and -2 for "unknown". None of them is a number of free bytes, so there is nothing to report.

Why not report zero. statfs(2) says undefined fields are zero, and zero free is precisely the answer that makes applications refuse to save before they have tried. So the mount advertises a large fixed amount instead — the same 1 PiB rclone’s VFS uses in the same position. The real used figure is added on top of it rather than replacing it, so df still shows what is actually stored.

What to do about it. Assign the account a quota in Nextcloud (Administration settings → Users). df then reports the server’s real numbers, within quota_revalidate_secs (Configuration) at the latest. Nothing else changes: the placeholder never limited what could be stored, it only meant the limit was unknown.

The mount says which case it is in, at info, once per fetch:

$ journalctl --user -u wusel@default | grep quota
... storage quota updated used=534696340 available=10202721900
... the server reported no usable free-space figure (unlimited, or not yet
    computed) — statfs keeps its placeholder used=614388147

The official Nextcloud desktop client hits the same wall and sidesteps it: for an unlimited account it shows "X in use" with no total and no bar. A filesystem has no such option — df has fields that must be filled.

An end-to-end encrypted folder is unreadable

A folder marked end-to-end encrypted in Nextcloud’s desktop or mobile client appears in the mount with meaningless names and unreadable content: random identifiers instead of file names, ciphertext instead of documents. Nothing is broken and nothing is lost — the folder is simply not ours to read.

Why it happens. End-to-end encryption happens entirely in the client. Every file gets a symmetric key, the file names and the folder’s structure live in an encrypted metadata blob, and those keys are wrapped with a keypair whose private half never leaves the user’s own devices, protected by the twelve-word mnemonic their client showed them once. The server therefore stores precisely what WebDAV hands us: random identifiers and ciphertext. That is the feature working as designed — the operator cannot read the folder either.

What Wusel does today. Neither decrypt such a folder nor mark it. The mount shows what the server returns, which is why the result reads as corruption rather than as a locked door.

Which half is small and which is not. Recognising an encrypted folder is cheap: the server flags it in PROPFIND (nc:is-encrypted, the same property the official client reads), and our directory listing already asks for nc:-namespaced properties — so it is one property, one state, and a folder the file manager can show as locked with a notice that says why. Decrypting is a project of its own: two metadata formats, the keypair, the mnemonic-protected private key and a keystore to hold it — security code, where approximately right is worse than absent.

Meanwhile. Use a client that implements it for those folders and keep them out of the paths you rely on in the mount. Everything outside an encrypted folder is unaffected.