skidoodle/filebrowser

📁 Fast, simple, self-hosted web file manager.

2

stars

39

commits

Go

primary language

Sep 13, 2026

updated

filebrowser
go
react
selfhosted

README

File Browser

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.

filebrowser

Quick start

services:
  filebrowser:
    image: ghcr.io/skidoodle/filebrowser:latest
    container_name: filebrowser
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
      - ./db:/db
docker compose up -d

Then open http://localhost:8080. The first visit offers to create an admin account.

Custom UID/GID

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:/db

The 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:/db

[!NOTE] 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.

Build from source

Requires Go 1.26+ and Bun:

just build
FILEBROWSER_ROOT=./data ./bin/filebrowser

Configuration

All settings come from environment variables.

VariableDefaultMeaning
PUID1000user ID the process runs as (Docker only)
PGID1000group ID the process runs as (Docker only)
FILEBROWSER_ROOT./datadirectory served to visitors
FILEBROWSER_DATABASE./filebrowser.dbpath to SQLite database
FILEBROWSER_ADDRESS0.0.0.0:8080listen address
FILEBROWSER_BASEURLemptysubpath the app is mounted under
FILEBROWSER_ACCESS_POLICYpublicpublic lets anonymous visitors upload, readonly limits them to browsing, private requires sign-in for everything
FILEBROWSER_MAXUPLOAD10GiBmaximum size of a single upload
FILEBROWSER_CACHEDIRsystem tempdirectory for thumbnails and other disposable data
FILEBROWSER_MAXTEXTSIZE10MiBcutoff for text type detection
FILEBROWSER_GUARDtruetoggle the abuse-protection chain
FILEBROWSER_TRUSTEDPROXIESemptycomma-separated proxy CIDRs for X-Forwarded-For
FILEBROWSER_REQUESTRATE60per-IP API requests per second
FILEBROWSER_DOWNLOADRATE200MiBper-IP download bytes per second
FILEBROWSER_POWDIFFICULTY4proof-of-work difficulty, 0 disables it
FILEBROWSER_SECRETemptycapability signing key; defaults to a key persisted in the cache dir
FILEBROWSER_INSECUREfalsedisable authentication, give every visitor full access
FILEBROWSER_ADMIN_PASSWORDemptyseed or reset the admin password
FILEBROWSER_DEBUGfalseverbose logging

Development

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 SPA

Run 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.

License

BSD 3-Clause. See LICENSE.

Contributors

skidoodle

39 commits

skidoodle/filebrowser

📁 Fast, simple, self-hosted web file manager.

2

stars

39

commits

Go

primary language

Sep 13, 2026

updated

filebrowser
go
react
selfhosted

README

File Browser

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.

filebrowser

Quick start

services:
  filebrowser:
    image: ghcr.io/skidoodle/filebrowser:latest
    container_name: filebrowser
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./data:/data
      - ./db:/db
docker compose up -d

Then open http://localhost:8080. The first visit offers to create an admin account.

Custom UID/GID

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:/db

The 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:/db

[!NOTE] 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.

Build from source

Requires Go 1.26+ and Bun:

just build
FILEBROWSER_ROOT=./data ./bin/filebrowser

Configuration

All settings come from environment variables.

VariableDefaultMeaning
PUID1000user ID the process runs as (Docker only)
PGID1000group ID the process runs as (Docker only)
FILEBROWSER_ROOT./datadirectory served to visitors
FILEBROWSER_DATABASE./filebrowser.dbpath to SQLite database
FILEBROWSER_ADDRESS0.0.0.0:8080listen address
FILEBROWSER_BASEURLemptysubpath the app is mounted under
FILEBROWSER_ACCESS_POLICYpublicpublic lets anonymous visitors upload, readonly limits them to browsing, private requires sign-in for everything
FILEBROWSER_MAXUPLOAD10GiBmaximum size of a single upload
FILEBROWSER_CACHEDIRsystem tempdirectory for thumbnails and other disposable data
FILEBROWSER_MAXTEXTSIZE10MiBcutoff for text type detection
FILEBROWSER_GUARDtruetoggle the abuse-protection chain
FILEBROWSER_TRUSTEDPROXIESemptycomma-separated proxy CIDRs for X-Forwarded-For
FILEBROWSER_REQUESTRATE60per-IP API requests per second
FILEBROWSER_DOWNLOADRATE200MiBper-IP download bytes per second
FILEBROWSER_POWDIFFICULTY4proof-of-work difficulty, 0 disables it
FILEBROWSER_SECRETemptycapability signing key; defaults to a key persisted in the cache dir
FILEBROWSER_INSECUREfalsedisable authentication, give every visitor full access
FILEBROWSER_ADMIN_PASSWORDemptyseed or reset the admin password
FILEBROWSER_DEBUGfalseverbose logging

Development

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 SPA

Run 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.

License

BSD 3-Clause. See LICENSE.

Contributors

skidoodle

39 commits

Languages

Go

55.5%

TypeScript

42.8%