Home NAS Part 4: Home Photo Gallery with thumbsup

May 26, 2020

After I set up my home NAS, I wanted to display my home photos on my local intranet. I looked at about 5 or so static photo gallery generator tools until I found thumbsup. More useful github link here. I was very close to writing something myself, but thumbsup was good enough.

The tool isn’t smart enough to be run on a massive collection of photos and have the result look like Google Photos. It requires cleaning and organizing your files first. To start out, I wrote a script to build a folder structure with photos for running the tool on by:

Here is the script:

set -euo pipefail

for file in "$@";do
    HASH=$(xxh128sum -q "$file"|cut -d ' ' -f1)
    DNAME=$(dirname "$file")

    DATETIME=$(exiftool -DateTimeOriginal -d %Y-%m-%d -j "$file" 2>/dev/null| jq -r '.[0].DateTimeOriginal')
    if [[ "$DATETIME" =~ .*([0-9][0-9][0-9][0-9])-([0-9][0-9])-[0-9][0-9].* ]]; then

    if [[ $YEAR == "unknown" ]]; then
	if [[ "$DNAME" =~ .*([0-9][0-9][0-9][0-9])-([0-9][0-9])-[0-9][0-9].* ]]; then

    if [[ $YEAR == "unknown" || $MONTH == "unknown" ]]; then
	echo "Unresolved date $YEAR/$MONTH: $file"
	mkdir -p "${PHOTO_ROOT}/${YEAR}/${MONTH}"
	ln -v "$file" "${PHOTO_ROOT}/${YEAR}/${MONTH}/${HASH}.${EXT}"

I would invoke it with the following:

find 20[0-9][0-9] -iname '*.jpg' -exec ~/bin/reorg-photo.sh '{}' ';'

(And I’d also do the same with mp4 and other file extensions)

Then, install and run the tool:

npm install thumbsup
node_modules/thumbsup/bin/thumbsup.js --input /mnt/backup/photos/by-date --output /mnt/backup/galleries/timmy --photo-download link --video-download link --photo-preview link --video-preview link

Here is what the gallery list looks like (the gallery list for each year looks similiar)

Gallery List View

View inside a gallery:

Gallery View

The photo view:

Photo View

It could probably use some cleaning up, but this isn’t really a replacement for Google Photos. I do enjoy being able to look at things with zero lag and at full resolution though.

The files are served from apache2 which comes installed on my distro. There is nothing special in the apache2 config file–this is the gist of it:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	DocumentRoot /mnt/backup
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

<Directory /mnt/backup>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted

The DNS name is handled by my DNS server, which I detailed in my last post.