A web file browser served by a single Go binary with an embedded React app. Anyone can browse, upload, and download. Optional accounts add file management: create, rename, move, delete, and private folders. Account data lives in a SQLite database; files stay on the plain filesystem.
services:
filebrowser:
image: ghcr.io/skidoodle/filebrowser:latest
container_name: filebrowser
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./data:/data
- ./db:/dbdocker compose up -dThen open http://localhost:8080. The first visit offers to create an admin account.
By default the container runs as 1000:1000. If your host volumes are owned by
a different user, set PUID and PGID:
services:
filebrowser:
image: ghcr.io/skidoodle/filebrowser:latest
ports:
- "8080:8080"
environment:
- PUID=1001
- PGID=1001
volumes:
- /mnt/nas/files:/data
- ./db:/dbThe entrypoint automatically fixes ownership of /data, /cache, and /db
before dropping privileges. This also works when bind-mounting multiple
filesystems under /data:
volumes:
- /mnt/ssd/documents:/data/documents
- /mnt/hdd/media:/data/media
- ./db:/dbNote
If you use user: "1001:1001" in compose instead of PUID/PGID, the
entrypoint skips the ownership fix and execs directly. Make sure your volumes
are already writable by that UID.
Requires Go 1.26+ and Bun:
just build
FILEBROWSER_ROOT=./data ./bin/filebrowserAll settings come from environment variables.
just dev # API on :8080 and Vite dev server on :5173
just test # Go tests with the race detector
just lint # golangci-lint
just fmt # gofmt and go vet
just build # production binary with the embedded SPARun just --list for the rest. The backend is Go 1.26+ on the standard
library. The frontend is React 19, TypeScript, Vite, and Tailwind CSS, built
with Bun.
BSD 3-Clause. See LICENSE.