lazygal is another static web gallery generator written in Python.

It can be summed up by the following features :

  • Command line based (thus scriptable).
  • Handles album updates :
    • Lazy : do not build what's already there.
    • Tells you what should not be in your generated directories (and delete it if you want to).
  • Presents all your pictures and videos and associated data:
    • Recursive : generates subgalleries. Follows symlinks for flexibility.
    • Sort pictures in the same directory by EXIF date if available. More sorting options available.
    • Auto rotates pictures if they contain sensor info.
    • Reads and present selected image metadata.
    • Copies image metadata in reduced pictures.
  • Makes browsing sharing pictures easy :
    • Can generate multiple sizes to browse pictures.
    • Breadcrumbs on every page.
    • RSS feed generation for your album updates.
    • Optional generation of ZIP archives of original pictures.
    • Output internationalization.
    • Optional breaking of big galleries (directories) on multiple pages.
    • HTML5 video pages for videos
  • Make customization easy :
    • Theming.
    • XHTML and CSS compliance for provided themes.
    • Multiple options for album and picture metadata (picture metadata, flat files).
    • Add template variables from the command line or from a configuration file.
    • Per-directory configuration.
    • Javascript or fully static navigation.
  • Does not change your original pictures directories (the source argument).

Example demos


lazygal requires :

Building a lazygal installation requires :

  • msgfmt for translations. intltool-update and xgettext are also needed to update translation files. All are included in the GNU gettext package.
  • pandoc to build manpages from markdown sources.


Usage is straightforward :

$ cd /var/www/album
$ lazygal ~/pics

More information can be found on the manual pages lazygal(1) and lazygal.conf(5).

If you want to force lazygal into checking a directory's contents, simply touch the source directory to modify its modification time :

$ touch album_source/gallery_to_check

Download & Changelog

A user friendly changelog for lazygal exists.

The latest lazygal version is available as an archive.

(full log of changes may be browsed in Lazygal's repository browser)

Lazygal is part of Debian (and thus Ubuntu universe), which should make it one apt install away if you use one of those.



Code may be downloaded using Git :

$ git clone http://sml.zincube.net/~niol/repositories.git/lazygal

It is browsable online in Lazygal's repository browser, and this page also provides an up to date snapshot of the development source tree.

lazygal may be used directly in the source repository, by calling the lazygal.py script. Building simply prepares the translations and the man pages. Updating a source checkout of the lazygal repository is done using git pull in the source directory.

Patches are very welcome.

Test suite

There is a test suite validating many options and ensuring that things do not break too often. The full test suite can be run:

$ ./setup.py test

Inidividual tests can be run using unittest facilities, for instance for the test_cleanup test in the TestGenerators test case:

$ python3 -m lazygaltest.test_generators TestGenerators.test_cleanup

or the whole TestGenerators test case

$ python3 -m lazygaltest.test_generators TestGenerators.test_cleanup

DEBUG logging can be set in the test suite by setting the DEBUG environment variable to any value.

$ DEBUG=1 python3 -m lazygaltest.test_generators TestGenerators.test_cleanup


To start a new translation, for example cs_CZ, you can proceed as follows. The first script requires intltool-update and xgettext from the GNU gettext package.

$ devscripts/update-po
$ cp locale/lazygal.pot locale/cz_CZ.po
$ $EDITOR locale/cz_CZ.po

(do not bother committing or sending in changes to lazygal.pot, they contain a lot of noise because of changes in line numbers)

Another side-note : in templates, translatable strings are declared in a character noisy way (I hope to fix this one day). As an example :

<p><a href="..">Parent</a></p>


<p><a href="..">${_('Parent')}</a></p>

Bugs & feature requests

This project has too few users/contributors to justify the use of a dedicated bug tracking application.

For now, bug reports and feature requests may go in :