Lab

nander

A file manager for your own server, used from the browser.

Question
Can a self-hosted file manager feel like Finder in the browser, dragging files out to the desktop included?
Result
Mostly. Drag in and out, previews, share links, a sandbox per user. Dragging out to the desktop only works in Chromium browsers. That is a browser limit, and the docs say so.

What it does

nander is a file manager you run on your own server and use from any browser. You point it at a folder, create users, and each user sees their own part of it.

  • Drag and drop both ways. Drop files or whole folders from the desktop to upload them, keeping the folder structure. Drag a file out of the browser onto the desktop to download it.
  • Previews for images (with a lightbox), video and audio with seeking, PDF, rendered Markdown, and syntax-highlighted source code that you can edit and save in place.
  • Zip and unzip from the interface. Extracts .zip, .tar and .tar.gz.
  • Share links for a single file, with an optional password and expiry date. The person on the other end doesn’t need an account.
  • A trash folder, so deleting can be undone.
  • Users and permissions: each user is confined to a folder, with separate switches for upload, delete and share. Admins manage everything from the same interface.
  • Search, grid and list views, multiple selection, cut, copy and paste, and keyboard shortcuts.

Availability

The code isn’t public yet. It runs as a Docker container with a single admin account created on first start. If you want to try it, write to [email protected].

How it is built

  • One static Go binary with pure-Go SQLite, in a Docker image of about 20 MB that runs as a non-root user.
  • Every endpoint that takes a path resolves it component by component, and checks every symlink again against the user’s folder. A .. or a symlink pointing outside is rejected on the server, whatever the browser sends.
  • Archive extraction checks every entry before writing anything (“zip slip”).
  • Passwords go through SHA-256 and then bcrypt, so long passphrases are not silently cut at 72 bytes.
  • Share links use a random 128-bit token, and the server checks their expiry on every access.

Known limits

  • Dragging files out to the desktop only works in Chrome, Edge and Brave. Firefox and Safari don’t support it, so their users get a Download button.
  • No thumbnails for video. That would need ffmpeg, which we leave out to keep the image small. Videos still play.
  • Share links work for single files, not folders.
  • Disk usage reporting only works on Linux.