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.