Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit

Bumps [terser]( from 4.8.0 to 4.8.1.
- [Release notes](
- [Changelog](
- [Commits](

- dependency-name: terser
  dependency-type: indirect

Signed-off-by: dependabot[bot] <>

Signed-off-by: dependabot[bot] <>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]>

Git stats


Failed to load latest commit information.


License Badge Version Badge

Fussel is a static photo gallery generator. It can build a simple static photo gallery site with nothing but a directory full of photos.

Features and Properties:

  • Absolutely no server-side code to worry about once deployed
  • Builds special "Person" gallery for people found in XMP face tags.
  • Adds watermarks
  • Mobile friendly
  • Automatic dark-mode


Albums Screenshot Album Screenshot
People Screenshot Person Screenshot


Demo Gif



  • Python 3
  • Node + Yarn

Install dependencies

Site Generator

  • pip install -r requirements.txt

Node Frontend

  • cd web
  • yarn install
  • cd ../

Setup Site


  • Copy .env.example to .env
  • Edit .env to your needs (minimal change is to set INPUT_PATH)

Curate photos

The folder you point INPUT_PATH at, must have albums in subfolders inside it with the folder names as the name of the albums you want in the gallery. Any further-nested folders will be ignored.


If you have your .env setup with: INPUT_PATH = /home/user/Photos/gallery

Then that path should look like this:

  - Album 1
  - Album 2
  - Album 3
  - ...

Generate your site

Run the following script to generate your site into web/build folder.

  • ./

Host your site

Point your web server at web/build or copy/upload the web/build folder to your web host HTTP root.

Quick setup

After running

  • python -m http.server --directory web/build (go to localhost:8000 in browser)

Development setup

  • cd web
  • yarn start


If you don't want to fuss with anything and would like to use docker instead to generate your site...



  • /my-input-folder is the absolute path to top-level photo folder
  • /my-output-folder is the absolute path to where you want the generated site written to

Note: The two -e env variables PGID and PUID tells the container what to set the output folder permissions to once done. Otherwise it is set to root permissions

docker run \
    -e PGID=$(id -g) \
    -e PUID=$(id -u) \
    -v /my-input-folder:/input:ro \
    -v /my-output-folder:/fussel/web/build \

Optional: You can provide any value found in the .env.sample file in a docker env variable using -e MYVAR=THING

docker run \
    -e PGID=$(id -g) \
    -e PUID=$(id -u) \
    -v /my-input-folder:/input:ro \
    -v /my-output-folder:/fussel/web/build \
    -e HTTP_ROOT=/my/alternate/path \
    -e WATERMARK_ENABLE=false \

Once complete you can upload the output folder to your webserver, or see what it looks like with python -m http.server --directory /my-output-folder