A FUSE filesystem client for Pydio Cells

Hi all! I’ve been using Pydio for a while now but have been disappointed with its lack of a solid sync tool. I was working around it for a while, but then it occurred to me - what if there was a FUSE-mountable filesystem for Pydio?

So with a day or two of work (while simultaneously learning the Go language), I’m glad to say that I’ve made significant progress on a FUSE adapter for Cells. It’s going to be cross platform for Mac, Windows, and Linux through their respective FUSE compat programs. It’s fast enough to let you edit files, watch videos, and dig through photos all without having to deal with selecting specific files or folders to sync. I’ll be releasing it soon as an open-source repository with downloadable binaries!

3 Likes

WOW! Now that’s utterly amazing and an incredible game-changer! Congratulations!

I’ve been trying to do a reliable, just-in-time sync using whatever method possible for years — all my efforts, unfortunately, were an utter failure. Granted, I’m on the Community Edition only — the Enterprise Editon has lots and lots of cool features.

That said, my last approach was to use rclone to connect to Pydio — and then mount the disk locally. The latter, however, is simpler than the former: getting rclone to reliably connect to Pydio is (at least) NP complexity :joy:

But using FUSE is pure genius — and it makes all the sense: ultimately, that’s what you wish to do, right? Mount the disk remotely?

I’ll be looking forward to some benchmarking! (WebDAV has no chance to compete.)

I’m on Community Edition as well - it’s plenty flexible enough for most use cases if you know what you’re doing! I also used rclone for a bit but found it to be extremely slow and unreliable - likely due to the fact that WebDAV is just a horrible protocol in 2026. The goal is to have a stable filesystem that allows you to easily access and modify your files without having to worry about tricky desyncs. I’m still working on it but I’m hoping to have an alpha out by next week.

This is a genuinely strong idea, and it solves the core “sync is optional, access is mandatory” pain that a lot of Pydio/Cells users feel.

A few practical points (based on what usually makes or breaks network-backed FUSE filesystems) that will help you ship something people actually keep installed:

Why this approach is compelling

  • No selective sync decisions: everything is “there” instantly, like a real drive.

  • Great for large media libraries (photos/videos) where syncing is slow and storage-heavy.

  • Much cleaner workflow for occasional edits (open–edit–save) instead of pre-syncing.

The hard problems you’ll want to get right

  1. Caching strategy (the #1 adoption driver)

    • Read-ahead + block caching for streaming video.

    • Write-back caching with safe flush semantics (users hate “saved” files that didn’t persist).

    • Configurable cache size + eviction policy.

  2. Conflict handling

    • What happens when the same file is edited from two machines?

    • Consider a predictable conflict scheme (e.g., filename (conflict - host - timestamp)), and surface it clearly.

  3. File locking and “save” behavior

    • Many editors do atomic saves (write temp file → rename).

    • Ensure rename, truncate, and atomic replace behave correctly, or editors will corrupt/duplicate content.

  4. Latency and small-file performance

    • Directory listings and stat calls can hammer APIs.

    • Aggressive metadata caching (with TTL) is often the difference between “feels local” and “feels broken.”

  5. Partial reads / ranged requests

    • Streaming and preview use cases depend on efficient range reads.

    • If you map cleanly to Cells’ API/WebDAV capabilities, you’ll avoid downloading whole files unnecessarily.

  6. Auth, token refresh, and security

    • Store credentials securely per OS (Keychain / Credential Manager / Secret Service).

    • Make token refresh seamless; auth failures are the main reason these tools get uninstalled.

Cross-platform reality check (so expectations stay aligned)

“Cross-platform FUSE” is doable, but the user experience differs:

  • macOS: works well with macFUSE, but you’ll need to handle “Finder quirks” and aggressive metadata calls.

  • Windows: typically better via WinFsp/Dokan-style layers; file semantics differ (especially around locking and paths).

  • Linux: most predictable environment for POSIX-like behavior.

What I’d want to see in the repo on day one (to build trust fast)

  • A clear “known limitations” section (locking, offline mode, conflict rules).

  • Benchmarks: directory listing, stat storms, 1GB video seek tests, large folder traversal.

  • Logging + a debug mode (supportability matters).

  • A roadmap: offline mode, pinned folders, background prefetch, and a “safe mode” for write caching.

If you nail caching + correct save semantics, you’ll have something that’s meaningfully better than “yet another sync client.”

Disclosure: I’m affiliated with The North Land Institute of Training (NLIT) in Dubai Knowledge Park (we offer hospitality diploma programs). We don’t teach IT, but tools like this are exactly what makes student file access and submissions smoother in real-world learning operations—so I’m watching this kind of project with genuine interest.

It’s now publicly available on GitHub! Executables are available for Linux and Windows, and of course all the code is open source. Go give it a try! GitHub - micahlt/cells-fuse: 🧩 A FUSE filesystem for Pydio Cells

2 Likes

Hey @micahlt nice to see such contributions appear!
Just a naive question (i did not look at your code yet), did you previously have a look at cells/cmd/cells-fuse at v5-dev · pydio/cells · GitHub ? Not really the same usage as its using the internal grpc API’s, but I think we should use the gRPC gateway (as the sync client does) instead of REST API for such a tool (for performance reasons)!

I… didn’t realize that existed :joy: I will probably not work as hard on this project now that I know an existing alternative exists. Good to know.

hey @micahlt actually it’s not really the same usage, as it’s not mounting files from a remote server, but from a local datasource on the server (more aimed at backup tasks).
But i thought it could be interesting to check if we could share some pieces of code :wink:

1 Like

Ah, okay! That’s good to know. I looked at utilizing the gRPC connection when I first started writing my FUSE client, but couldn’t find enough documentation about how it works specifically. Do you have anywhere you could point me to?

I’m drooling…


Well, seriously now…

I think you did an outstanding job! :star: :star: :star: :star: :star: :star_struck:

Sadly, though, I can’t get GTK to properly compile under macOS Tahoe (w/Apple Silicon). The problem is not with your impeccable Go code, which is a precious gem :gem_stone: — it’s just C/C++ Dependency Hell™,

It compiles fine under several variants of Linux I have around here. Unfortunately, none of them has a display — so I can’t test it out :cry:

Therefore, I seriously encourage you to pursue your proposed --nogui change!

Or, alternatively, see if @charlessuggestion above makes more sense (I haven’t checked either).

Last but not least, one possible alternative is to use Fyne. See below (if you dare) for some suggestions…

If you are *really* interested in the whole story...

I’m a Mac user, and I’m on Apple Silicon and all that. I also have Rosetta 2 turned off (= Apple’s Intel emulation for ARM64 chips, for those who don’t know), deliberately so, to make sure I can rule out in advance what won’t be working in 2028, when Apple will discontinue any form of Intel support.

And, deliberately, I’m using MacPorts as my preferred package manager for macOS. These days, Homebrew is far more popular, but… let’s say that their maintainers are far too opinionated for my tastes.

That said…

We all know how cool it is to be able to call any C library from Go, usually effortlessly, which means that you can get access to an infinite amount of awesome libraries out there with just a thin Go wrapper on top (or, well, those of us who happen to love Go are used to that).

There is just one catch.

While Go has an amazing track record of being uncannily compatible with essentially everything out there, and (modern) packaging — so long as package maintainers aren’t changing the URLs of their packages too often (which you can — but you probably shouldn’t) — essentially means a “zero broken dependencies” environment (indeed, one of the main reasons for Google having ‘invented’ it in the first place), that’s only true for… well, native Go.

Start adding non-Go libraries, and… well, there goes your Dependency Heaven™ down the drain.

More specifically, in order to make sure you can distribute a Go binary to any computer and don’t worry much if it has everything installed, Go is mostly statically built. The theory is simple: in the days when disk space was at a premium, shared libraries made a lot of sense to keep binaries tiny and not waste unnecessary disk space. The drawback, of course, is that you’d have to make sure you kept all those dynamically-linked libraries in perfect sync — that meant dealing with Dependency Hell™.

Therefore, by default, Go builds everything statically. Compile it, distribute it, never worry about a single missing file ever again. Embed your assets (files, icons, etc.) into the binary for extra ease of mind — no extraneous files, just a big, fat binary. In essence, a Go binary is a Docker-in-a-file kind of thing; it contains everything you need to run it (and it’s not a coincidence that Google released Docker next, generalising the concept in Go to a virtual-machine-that-runs-natively-all-packed-in-a-single-package).

You can force Go to compile dynamically as well, of course; that’s the approach taken to bring Go into embedded devices, where everything — memory, CPU, ‘disk’ space — is reduced to the essentials, and the more you can share among applications, the better.

Then again, most embedded devices are not upgraded partially (there are many exceptions, of course, Raspberry Pi being perhaps the best known): they’re upgraded integrally in one go. This guarantees that no ‘dangling’ library dependencies are present — you get the whole system upgrade in a single package.

Therefore, there are two schools of thought regarding combining C/C++ and Go together, since both have, well, misaligned philosophies: C/C++ links dynamically by default; Go statically. Which one should you pick? Or maybe even… both? (Aye, you can mix and match the two approaches.)

As it happens, usually (with few exceptions that I’m aware of), Go’s intermediate compiling steps using CGo (the ‘bridge’ between the two) will grab whatever dynamic libraries are pre-installed in the system. While the Go packages may be dynamically linked as well, it’s more usual to keep them statically linked.

The consequence is that, if you upgrade the C libraries, your Go application(s) may continue to work… or not at all. (The latter is more frequent than the former.)

To make matters even worse, it’s usual that developers of Go ‘thin wrappers’ over extensive C libraries will pick a ‘stable’ version — i.e., the one their operating system has installed by default — and adapt everything on the Go side to fit that specific version’s intrinsic oddities and quirks.

Then you ship a Go application from, say, Ubuntu Linux to CentOS, and, to your utter surprise, ‘nothing works’, even if both have the same libraries installed.

Aye — but do they have the exact version numbers?

Or perhaps Ubuntu has a ‘developer’ version while CentOS relies on a ‘stable’ version instead? And then, of course, you’ve got Long Term Support versions — which remain ‘frozen in time’ (except for security patches and extreme bug fixes) for several years. It’s great to base one’s Go wrapper code on one of these libraries, believing that it’s as close as you can get to having stable, predictable library dependency trees — until, of course, you don’t.

Throw in different architectures — ARM64 vs. Intel x86_64 — or different operating systems — Linux vs. FreeBSD vs. macOS vs.… Windows — and things become exponentially more confusing to master.

Not, mind you, because of Go. Go is perfectly agnostic — you can run and compile it on pretty much anything, and it will look and work essentially in the same way. I’d safely guess that over 99% of the Go code is totally platform-independent. And even those things that aren’t will be mostly low-level (e.g., acquiring handles from the operating system); allowing the thin layer immediately above that to be absolutely platform-independent.

Unfortunately, that’s not how C works. C makes the reverse assumption: everything is different from platform to platform, from operating system to operating system, even from an individual machine to the next. To cope with all of that mess, C (and C++) rely on a very complex mechanism of generating ‘universal’ configuration files that will help the compiler in figuring out what exactly is available and what is not, and adapt to it (e.g., employing the equivalent of ‘shims’ and ‘polyfills’ to deal with missing features). There are a plethora of tools to deal with that, and I’m sure I cannot name but a few (autoconf, CMake, meson/ninja, are a few of the most common ones) — there must be zillions out there. Even Apple and Microsoft have their own (mutually incompatible, of course).

At a higher level, this also remains true. There are a gazillion graphic libraries implemented in C and C++. The most popular ones tend to be cross-platform, and that also means they need exhaustive descriptions on how to compile all the required libraries — until, at a much higher level, programmers can rely upon well-documented APIs to interface with their GUIs, and ‘the same code runs anywhere’. This is true for everything from the humble wxWidgets to Qt to GTK to KDE, to, say, the Unity and Unreal 3D Engines. All ship with extensive tools to deal with these complexities ‘under the hood’ and, eventually, present the high-level programmer with a clean, predictable environment, upon which they can develop their tools, disregarding what happens beneath and letting the tools figure it out properly.

That’s all very nice, of course, if everything were ‘frozen in time’, and if developers would stick to the One Graphics Library To Rule Them All™ principle (well, both Apple and Microsoft strongly encourage their own variant, of course).

In practice, it means struggling with all of them, hoping against hope that they don’t start cannibalising each other, ‘imposing’ versions and configurations that work well for some cases, but are absolutely useless in others (and, naturally, vice-versa).

Needless to say, this is exactly what happens with @micahit’s awesome cells-fuse package: it compiles like a charm on a few variants of Linux that I’ve tested (unfortunately, all are headless servers, so I can’t ‘see’ the GUI, I can only say that I would ‘see’ something if, well, I had something to view with).

But under macOS — forget it, at least under my specific configuration: Apple Silicon (ARM64) + macOS Tahoe + MacPorts. There is simply no way to get it all working together, and, believe me, I’ve tried.

In fact, for the past 24 hours, I’ve been busy figuring out how to get GTK4 working on my specific configuration, at least to the point where the Go libraries relying upon GTK4 are happy with what they ‘see’ down under. Unfortunately, this is not obvious at all — too many things are broken, making too many ‘wrong assumptions’ on what ought to be available (but which isn’t) and how to add the ‘next’ layer on top of the previous one.

Alas, so far, I haven’t been lucky — it took me half an eternity to ‘fix’ about a dozen very tricky dependencies, but… I merely scratched the surface of the iceberg that sunk the Titanic. There are layers and layers and layers of good C code to deal with — ‘it’s turtles all the way down’ — and I didn’t manage to ‘fix’ several of them.

Note that this is hardly the fault of cells-fuse: the choice of using GTK to get a portable, universal GUI that works on top of ‘anything’ is a very good one. GTK is what’s used by millions of users running Inkscape or FontForge — among thousands of other popular tools — under whatever operating system they might have.

At the end of the day, Go actually compiles cells-fuse, reinforcing the idea that nothing is ‘wrong’ with your code. It just misses a handful of variables from the ‘wrong’ version of the dynamic libraries linked together, dumping errors such as

./cells-fuse
dyld[94844]: Symbol not found: _g_desktop_app_info_get_filename
  Referenced from: <58063F11-41B1-3B49-AAF7-1B5DB0B96E37> /opt/local/lib/libgtk-4.1.dylib
  Expected in:     <9642C08A-3729-3F8E-AAC9-184AAE163859> /opt/local/lib/libgio-2.0.0.dylib
Abort trap: 6              ./cells-fuse
```

Note that, as far as I know, you're **not** making use of *that* 'symbol' at all — but GTK is!

In my example above, I have spent plenty of time tweaking `libgtk-4.1` so that it compiles and runs without issues. Sadly, though, GTK requires a *lot* of libraries, most of them not even part of the *same* repository — which means going through each of them manually, bumping it to the 'correct' version, rebuild everything... and hope it works... if not, go to the next library in the list of dependencies... do the same... and so on, and so forth, until (theoretically), considering that there is just a *finite* number of libraries overall, *eventually* there will be an *end*.

But I've not been persistent enough to go until the end, of course.

### Enter Fyne

All graphic libraries, to the best of my knowledge, are, at some point, bound to a C library that ties into the operating system. The difference is mostly how 'deep' you need to go until you reach that layer.

GTK, as far as I can understand it, is relatively higher-level: it provides the shims to use the topmost layer of the library, and just thinly wraps the Go layer around it. This is, after all, the most common option. Unfortunately, it also means that there are a *lot* of C layers that need all to be in sync, dependency-wise, which is the nightmare described before.

A few steps deeper you hit on OpenGL (I suppose the same applies to Vulkan; I haven't checked). Here, you've stripped a lot of the upper layers away, and get closer to the hardware. There are plenty of OpenGL C libraries — half a dozen are the most popular. The so-called 'official Go package' for OpenGL does something clever: first, it figures out which library you've got. Then, because all OpenGL libraries come with a XML description of all functions and parameters they support (and these *must* be in sync with the library itself!), what these clever guys have done was the following: extract the XML from a well-known location and pre-generate the Go shims that will call these functions directly from C. Therefore, if you ever change libraries — or get an updated version of the library you happen to have installed — all you need is to re-generate the shims again and compile the Go code against the 'new' library. The End. There is *nothing* to change on the Go programming itself, which will only call Go functions — standardised at a level that allows Go programmers to have some confidence that *these* functions will not abruptly change their interface. What happens at the 'shim layer' is fully automated (yay for `go generate`! :grinning_face_with_smiling_eyes:) — so even when cross-compiling to a different platform, which may or may not have the 'correct' set of libraries, that will be irrelevant: the OpenGL Go package will adapt its 'shim layer' to whatever is installed, and the rest of the code remains exactly as it is. Of course, you will need at least to have *a* developer's version of OpenGL properly installed on the target platform *and* have a fully functional C/C++ compiler. But there should be no surprises.

Alas, as good as it sounds, the OpenGL way has two major drawbacks:

1. It's really programming at a much lower level, which means you don't get the elegance of writing neat, polished, simple, very-high-level code. You're really shuffling bits to buffers and intersecting rectangles and so forth. Obviously, you can *do* your own 'GUI construction SDK' using OpenGL primitives — I'm actually aware of an insane company which has been doing just that for the past 20 years, the fools... — but it's truly a nightmare. OpenGL is flexible, and you get full access to all the magic that the graphics card can give, but it's necessarily complex at the low level.
2. Because different OpenGL libraries have different ways of addressing the hardware and *may* present different APIs to the caller, it means that the OpenGL Go meta-shim-layer-approach, by necessity, will use the largest subset that is supported by *all* of the libraries. This, in turn, means that Go's OpenGL access will be the one with the *least* options (or, at best, have as many functions as the smallest of all the possible libraries).

But there are other solutions out there!

The one that captured my interest most was [**Fyne**](https://fyne.io/). This is a GUI application environment that comes as close as possible to be 'all native'. Of course it isn't (even though they sort of claim that you don't need to use CGo on Windows and are trying to get their solution/trick/hack to be used by the maintainers of the official Go port of OpenGL), but... it's perhaps the 'best' solution out there, for a given value of 'best', of course.

OpenGL, as it goes, is *huge* — because it targets *everything* you can ask a graphics card to do, namely, complex parallel calculations to render 3D images in real time with shaders and whatnot. But to do a GUI you don't need any of that — you're just handling 2D rectangles (and a few odd polynomial shapes, all of which are in 2D). That means that only a subset of OpenGL is actually being actively used. The Fyne developers cherry-picked all the functions they *really* need, and packed those together in a mini-OpenGL library, so to speak: it remains in sync with the official Go port, but it's stripped down to the bare-bone essentials. The bulk of the code is offering a very abstract, high-level layer of functionality that is as simple to learn as GTK, wxWidgets, or similar approaches. In fact, there is *almost* a 1:1 correspondence between your GTK code and the Fyne code; I believe that even I could do a 'translation', so to speak, especially because you restrict the GUI bits to just two Go source files, one of which is just the initialisation on `main()`. There is still some work to be done — like translating human languages, you can do it best if you happen to be well-versed in *both*, and I've never toyed around with GTK before — but it's not far-fetched to believe that this can be accomplished.

Unlike, say, the GTK or Qt ports, you do *not* need to have *any* OpenGL library pre-installed (or even worry about it at all): the code is self-contained, so to speak, adding C code snippets (and even some assembly!) on demand, as needed, to interface with whatever graphics card there is underneath all layers. The dependency on C is kept to the barest of the barest minimums — thus the claim that they could avoid CGo on Windows altogether (which, as said, I cannot confirm).

It means that they had little to worry about, say, porting Fyne to WASM: it compiles out of the box, since Go does that anyway, and you don't need to worry about low-level interfacing with device drivers and such. WASM comes with its own set of rules, WebGL and so forth, and you can call all of that under Go directly.

As a bonus, the Fyne team has developed a great, universal packager for 'all' platforms out there, and, aye, that includes mobile platforms as well. The only thing I didn't see (yet) is support for, say, game consoles, but I suppose that their focus is, for now, non-gaming environments — just plain GUIs.

Although Fyne has been around for several years, it shows that it's not a very polished product — yet. For instance, it's not (yet) a Qt replacement, to put it bluntly. There's already have a rapid development tool ([Apptrix](https://apptrix.ai/)), which is currently proprietary (it will be released as open source 'soon'), and it only supports the 'standard' Fyne widget set, which is really bare-bones — for instance, while it includes a TreeView, it does *not* include a file browser. There are plenty of volunteers contributing code, though, and (naturally enough) a file browser is one of those; but, as of Apptrix 1.0.0, it's not supported yet.

You will notice that the Apptrix guys don't even mention Go on their website. Their idea is to have developers dragging and dropping widgets around the screen, press a button, and generate all the Go code using Fyne to develop ready-made, packaged applications for all possible platforms — without writing any code at all. This is partially made possible because Fyne can directly access a JSON file describing the whole interface, and auto-generate all the necessary stubs to get working — which is exactly what you need for a rapid prototyping tool that relies on visual programming to accomplish most of the magic.

But, naturally, you can do all the programming manually (as you did).

What particularly impressed me was, in fact, the outstanding WASM support: on the same hardware, visually, there is *zero* difference between something running in a browser or something running from a natively-compiled application. Naturally, there *is* a performance hit. But just from a visual point of view, it's *identical* (there are a few exceptions, I think, which haven't been ported yet).

Why does that matter? Well, these days, we're plagued with the dichotomy of writing so-called backend code using a set of programming languages, and then worry about a completely different environment for the frontend code — which, these days, is almost always either a React Native or an Electron application.

Fyne *could* be a valid alternative, at least in the Go ecosystem. With Fyne, the main focus is on the actual application code, while the GUI-specific issues become an afterthought — you just write the whole  once, using a single programming language (Go), and deploy it anywhere, just like Electron or React Native promise.

Thanks for the super detailed response! The initial UI prototype was actually written in Fyne, but I ran into some really annoying issues that I couldn’t seem to find documentation on. If cells-fuse is unable to compile correctly on macOS natively, I wonder if there’s the possibility of using a VM of sorts (Docker container?) that has the correct libraries linked. I’m looking into compiling an Intel macOS binary, since that’s within my wheelhouse since I have a QEMU machine with Sonoma.

@GwynethLlewelyn Can you take a look at this? I set up a GitHub Action to compile for all platforms, and I got an Apple Silicon build to complete with no errors. I don’t have a Mac to test it on though, so go see what your mileage is: Release 1.1.4a · micahlt/cells-fuse · GitHub

Hi @micahlt, first of all thank you for your incredible effort, this project will be invaluable to all of us in the community! I, like many here, have failed with the official synchroniser, and have a very unrelialbe time with the WebDAV share, but that’s all there was. Until now.

Yesterday, I successfully compiled the app on both my masOS 14.7.6 on a Mac M2 Apple Silicon, and on Ubuntu 20.04, aarch64 version, running as a VM guest within Parallels.

While the app compiles and runs successfully, I have had the same experience on both:

  • The connection, thus folder browsing, is very slow:
    • % time ls ~/Cells/Personal\ Files/Books
      • ls ~/Cells/Personal\ Files/Books 0.00s user 0.00s system 0% cpu 1.836 total
        while actually taking nearly three seconds to list a folder with six items (folders and files) within it
  • I cannot open any PDF, PNG or JPG files listed in the Finder, terminal or Ubuntu’s Files (version 46.4) file browser, equally:
    • % open ~/Cells/Personal\ Files/Books/Surrounded\ by\ Idiots.pdf
      • The file “Surrounded by Idiots.pdf” could not be opened.
        • It may be damaged or use a file format that Preview doesn’t recognise.

As I said, these problems are evident in both Linux and on the macOS, eliminating the OS or dependent libraries as culprits. And, today I downloaded your latest binary, 1.1.4 and ran it on macOS, with the same results.

The terminal is constantly printing errors, too many to want to reprduce here, the main one of which is a Getattr Error…Could not retrieve node…

Finally, on macOS at least, the binary usually consumes 94-101% CPU, which is naturally excessive. I haven’t checked the same in Ubuntu as today it doesn’t mount, so can not be sure what’s going on there, the process may be better behaved.

I love the promise of the project, cannot wait to see it production-ready, a full replacement to unreliable WebDAV mounts, and am willing to help sponsor the project to help its continued development.

Many thanks!

Thanks for taking a look at cells-fuse! I’m curious about the issues you’re experiencing. We can look at a few things. First of all, try testing with the binary attached to the latest release on GitHub, just to make sure you have all the needed changes. Second, are you 100% sure that you are using a Cells account that has the right permissions to access the files? Third, can you check the logs specifically for auth-related errors? The Getattr errors are making it sound like you may not be logged in properly. Fourth, can you install macFUSE from Homebrew before running the executable and see if that does anything?

Would love to solve these issues!

Latest release on GitHub

Following manual compiling from source two days ago, version 1.1.3, yesterday (before writing my response) I tried 1.1.4a. The official binary reacted in the same way as the prior compiled version.

Cells account with permissions

The Cells installation is the Community Edition, installed and administered by me. I confirm that I can work with it 95% reliably using Montain Duck or CloudMounter to mount Cells’ through the WebDAV protocol. That is to say, the mount works 100% of the time, but (as I posted on this forum, with no response, in the past) some files, usually larger files, incorrectly save and cannot be opened. In these cases only an upload through the web interface is always perfectly reliable.

Hence, I have the right permissions and am able to use it fairly decently through WebDAV.

Install macFUSE from Homebrew

I have now uninstalled (I hope) the macFUSE package, and installed the latest macFUSE, 5.1.3, through Homebrew.

Check logs

Logs are incessant, full of permanently-cycling warnings, most like the following:

Getattr Error: [GET /tree/stat/{Node}][404] headNodeNotFound {“Detail”:“Not Found: Could not retrieve node /sacha/Books/._Surrounded by Idiots.pdf”,“Title”:“Could not retrieve node /sacha/Books/._Surrounded by Idiots.pdf”}

and

Getattr Error: [GET /tree/stat/{Node}][404] headNodeNotFound {"Detail":"Not Found: Workspace ._Personal Files is not found","Title":"Workspace ._Personal Files is not found"}                                                                              

By the looks of it, these are the two types of errors I can see repeated endlessly, for every listed workspace and node.

General comments:

  • The delay in liting contents is linear, as can be expected
    • In the neighbourhood of 90 seconds for the top-level folders/workspaces (39 of them, due to Cells’ limitation of being only able to set access permissions on Workspaces, each backed by an individual Data source)
    • Around 36 seconds for the ‘Personal Files’ folder containing 12 subfolders
    • Around 3 seconds for a ‘Books’ folder with 6 subfolders/files

I am still unable to open any files, with the same error message as I already reported.

I tried saving a simple text file to a folder, with the contents “This is a test file”. It works, the file saves, and is listed using the ls command, but is essentially unreadable. A hexdump returns the following (if it helps):

% hexdump ~/Cells/Personal\ Files/Books/test.txt
0000000 0000 0000 0000 0000 0000 0000 0000 0000
0000010 0000 0000 0000
0000015

with the following log output:

Getattr Error: [GET /tree/stat/{Node}][404] headNodeNotFound {“Detail”:“Not Found: Could not retrieve node /sacha/Books/._test.txt”,“Title”:“Could not retrieve node /sacha/Books/._test.txt”}

@micahlt nice job, thank you.
I just tried to install on windows and I think it doesn’t include some GTK related packages.. therefore I installed GTK+2 for Windows Runtime Environment, and the main *.dll not found error gone but the application still doesn’t work. I think it just built with Linux environment and needs to be amended to work on other OS.