| assets | ||
| images | ||
| output | ||
| templates | ||
| .env.example | ||
| .gitignore | ||
| build.sh | ||
| Dockerfile | ||
| LICENSE | ||
| README.md | ||
Shellery
Simple SSG to create dynamic gallery one-pagers in your shell! Shell+Gallery
- Status: Beta
- Instance/ Demo: schief-117.com
Features
Available:
- Simple use, single dependency (exiftool)
- Removes EXIF/GPS metadata from published images by default
- Configurable title and optional footer via environment variables
- no Javascript
- Lightbox of image with anchor
- Order of images via filename
- Container available
- Simple to modify (Pictures and Templates)
Ideas:
- check file formats
- conf file for options
- anonymize file names
- sections via file names
Not planned:
Requirements
bashand GNU coreutilsexiftool-apt install libimage-exiftool-perl(Debian/Ubuntu) orbrew install exiftool(macOS)
Docker/Podman users need nothing on the host, exiftool is baked into the image.
Building with --keep-exif / STRIP_EXIF=0 does not require exiftool.
Usage
Docker / Podman
mkdir -p images output
podman run -v $(pwd)/images:/app/images -v $(pwd)/output:/app/output git.uphillsecurity.com/cf7/shellery:latest
Local
- Clone
- Put images into
./images/ ./build.sh- Check
./output/
Modify files accordingly.
Docker Build
Build and run:
docker build -t localhost/shellery .
docker run -v $(pwd)/images:/app/images -v $(pwd)/output:/app/output localhost/shellery
The generated gallery will be in ./output/index.html
Configuration
All options can be set in a .env file, as environment variables, or as flags.
.env.example lists every option with its default, so an unedited copy changes nothing:
cp .env.example .env
.env is gitignored. Precedence is flags > environment > .env > defaults, so a
-e value passed to the container still wins over the file. Point ENV_FILE at another
path to use a different file.
| Variable | Flag | Default | Effect |
|---|---|---|---|
GALLERY_TITLE |
--title=TEXT |
Gallery |
Page <title> and the <h1> header |
SHOW_FOOTER |
--no-footer |
1 |
Set to 0 to hide the "Powered by shellery" footer |
STRIP_EXIF |
--keep-exif |
1 |
Set to 0 to publish image metadata as-is |
ENV_FILE |
- | .env |
Path to the config file to load |
GALLERY_TITLE="Holiday 2026" SHOW_FOOTER=0 ./build.sh
# or
./build.sh --title="Holiday 2026" --no-footer
# container, via -e
podman run -e GALLERY_TITLE="Holiday 2026" -e SHOW_FOOTER=0 \
-v $(pwd)/images:/app/images -v $(pwd)/output:/app/output \
git.uphillsecurity.com/cf7/shellery:latest
# container, via a mounted .env
podman run -v $(pwd)/.env:/app/.env:ro \
-v $(pwd)/images:/app/images -v $(pwd)/output:/app/output \
git.uphillsecurity.com/cf7/shellery:latest
Metadata removal
EXIF, GPS, IPTC and XMP metadata is stripped from every image by default. Only the copies
in ./output/ are processed, your originals in ./images/ are never modified.
To publish images with their metadata intact:
./build.sh --keep-exif
# or
STRIP_EXIF=0 ./build.sh
# container
podman run -e STRIP_EXIF=0 -v $(pwd)/images:/app/images -v $(pwd)/output:/app/output git.uphillsecurity.com/cf7/shellery:latest
Notes
Security
For security concerns or reports, please contact via hello a t uphillsecurity d o t com gpg.
License
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
- ✅ Commercial use
- ✅ Modification
- ✅ Distribution
- ✅ Patent use
- ✅ Private use
- ✅ Limitations
- ❌Trademark use
- ❌Liability
- ❌Warranty