A self-hosted non-invasive single-binary photo gallery with a focus on speed and simplicity.
<a href="https://demo.photofield.dev">Demo</a> ·
<a href="https://photofield.dev/quick-start">Quick Start</a> ·
<a href="https://photofield.dev">Docs</a>
<a href="https://github.com/SmilyOrg/photofield/releases"><img alt="GitHub Release" src="https://img.shields.io/github/v/release/smilyorg/photofield?sort=date&display_name=release&style=flat-square&labelColor=%23dd8888&color=%23eee"></a>
<a href="https://github.com/SmilyOrg/photofield/actions"><img alt="GitHub Actions Workflow Status" src="https://img.shields.io/github/actions/workflow/status/SmilyOrg/photofield/.github%2Fworkflows%2Fci.yml?style=flat-square&labelColor=%23dd8888&color=%23eee"></a>
<a href="#built-with"><img alt="Tech stack: Golang and Vue 3" src="https://img.shields.io/badge/tech-Go%20%26%20Vue-white?style=flat-square&labelColor=%23dd8888&color=%23eee&icon=go"></a>
<a href="https://github.com/SmilyOrg/photofield/stargazers"><img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/smilyorg/photofield?style=flat-square&labelColor=%23dd8888&color=%23eee"></a>
<a href="https://github.com/SmilyOrg/photofield/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/SmilyOrg/photofield?style=flat-square&logoColor=white&logoSize=auto&labelColor=%23dd8888&color=%23eee"></a>
<a href="https://discord.gg/qjMxfCMVqM"><img alt="Discord" src="https://img.shields.io/discord/1210642013997764619?style=flat-square&logo=discord&logoColor=white&logoSize=auto&label=chat&labelColor=%23dd8888&color=%23eee"></a>
Table of Contents

Zoom to logo within a sample of 43k images from open-images-dataset, i7-5820K 6-Core CPU, NVMe SSD
Photofield is a photo viewer built to mainly push the limits of what is possible in terms of the number of photos visible at the same time and at the speed at which they are displayed. The goal is to be as fast or faster than Google Photos on commodity hardware while displaying more photos at the same time. It is non-invasive and can be used either completely standalone or complementing other photo gallery software.




See the documentation for more information.
Make sure you create an empty data directory in the working directory and that
you put some photos in a photos directory.
docker run -p 8080:8080 -v "$PWD/data:/app/data" -v "$PWD/photos:/app/photos:ro" ghcr.io/smilyorg/photofield
The cache database will be persisted to the data dir and the app should be
accessible at http://localhost:8080. It should show the photos collection by
default. For further configuration, create a configuration.yaml in the
data dir.
docker-compose.yaml example
This example binds the usual Synology Moments photo directories and assumes
a certain path structure, modify to your needs graciously. It also assumes you
have configured the /photo and /user directories as collections in
the configuration.yaml.
```yaml
version: '3.3'
services:
photofield:
image: ghcr.io/smilyorg/photofield:latest
ports:
- 8080:8080
volumes:
- /volume1/docker/photofield/data:/app/data
- /volume1/photo/:/photo:ro
- /volume1/homes/ExampleUser/Drive/Moments:/exampleuser:ro
```
./photofield or double-click on photofield.exe to start the server.Open http://localhost:8080, folders in the working directory will be displayed as collections. 🎉
📝 Create a configuration.yaml in the working dir to configure the app
PHOTOFIELD_ADDRESS=:1200 – listen on a different port (default :8080)PHOTOFIELD_DATA_DIR=/path/to/data – change the directory where configuration.yaml and the cache databases are storedYou can configure the app via configuration.yaml.
The location of the file depends on the installation method, see Getting Started.
The following is a minimal configuration.yaml example, see [defaults.yaml]
for all options.
collections:
# Normal Album-type collection
- name: Vacation Photos
dirs:
- /photo/vacation-photos
# Timeline collection (similar to Google Photos)
- name: My Timeline
layout: timeline
dirs:
- /photo/myphotos
- /exampleuser
# Create collections from sub-directories based on their name
- expand_subdirs: true
expand_sort: desc
dirs:
- /photo
Scoop (Windows): scoop install go-task exiftool watchexec
sh
git clone https://github.com/smilyorg/photofield.gitsh
go getsh
cd ui
npm installRun both the API server and the UI server in separate terminals. They are set
up to work with each other by default with the API server running at port 8080
and the UI server on port 5173.
task is Task as defined in the prerequisites.
task watch the source files and auto-reload the server using watchexectask run the servertask ui to start a hot-reloading development serverui folder
sh
cd ui
npm run devPull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Distributed under the MIT License. See LICENSE for more information.
$ claude mcp add photofield \
-- python -m otcore.mcp_server <graph>