assets | ||
cmd/photoprism | ||
configs | ||
frontend | ||
internal | ||
scripts | ||
.dockerignore | ||
.gitignore | ||
.travis.yml | ||
CHANGELOG.md | ||
docker-compose.prod.yml | ||
docker-compose.travis.yml | ||
docker-compose.yml | ||
Dockerfile | ||
go.mod | ||
go.sum | ||
LICENSE | ||
Makefile | ||
README.md |
PhotoPrism
PhotoPrism is a server-based application that makes it simple to automatically tag, search and organize your photos without uploading them to public cloud services such as Flickr, Facebook or Google Photos. Written in Go. Runs on every computer that has Docker installed. Originals are stored in the file system in a structured way for easy backup and reliable long-term accessibility.
Overview
It was a long way from the first ideas to this proof-of-concept. Our goal is to provide the following features for the first release:
- Easy-to-use Web interface based on Material Design (20% implemented)
- High-performance command line tool (80% implemented)
- No proprietary or binary data formats
- Automatic RAW to JPEG conversion (implemented using Darktable)
- Duplicate detection (RAW plus multiple JPEG files can be used simultaneously) (implemented)
- Automated tagging using Google TensorFlow (90% implemented)
- Reverse geocoding based on latitude and longitude (implemented using OpenStreetMap; support for Google Maps on the todo list)
- Image search with powerful filters (40% implemented)
- Albums to organize your photos (0% implemented)
- Easy backup and export (10% implemented)
Please ask if you have any questions. A more detailed documentation - also for non-developers - will follow.
Donations
To continue working full-time and create a community, we are looking for public funding or an investor who shares our vision. Please contact us if this is you or you have an idea. Since the software is not released yet, we don't want to ask for small donations from individuals.
Please leave a star if you like this project, it also helps.
Setup
Before you start, make sure you got Git and Docker installed on your system. Instead of using Docker, you can also setup your own runtime environment based on the existing Docker configuration (not recommended).
Step 1: Run Git to clone this project:
git clone git@github.com:photoprism/photoprism.git
Step 2: Start Docker containers:
cd photoprism
docker-compose up
Note: This docker-compose configuration is for testing and development purposes only.
Step 3: Open a terminal to run tests and commands:
docker-compose exec photoprism bash
make
make test
make install
go run cmd/photoprism/photoprism.go start
See Quick and easy guide for migrating to Go 1.11 modules for an introduction to Go Modules and Makefiles.
Directory Layout
The directory layout is loosely based on https://github.com/golang-standards/project-layout.
Assets like photos, built JavaScript/CSS files and HTML templates are located in assets/
by default. You can configure individual paths in the config file, using environment variables or command flags.
Example configuration files can be found in configs/
.
The frontend code is located in frontend/
. Developers run npm run dev
to watch files and automatically re-build them when changed.
All other paths contain Go source code and scripts used for building the application.
Web Frontend
Open a terminal an type photoprism start
to start the built-in server. It will listen on port 80 by default.
The UI is based on Vuetify, a Material Design component framework for Vue.js 2.
Command-line Interface
Running photoprism
without arguments displays usage hints:
NAME:
PhotoPrism - Digital Photo Archive
USAGE:
photoprism [global options] command [command options] [arguments...]
COMMANDS:
config Displays global configuration values
start Starts web server
migrate Automatically migrates / initializes database
import Imports photos
index Re-indexes all originals
convert Converts RAW originals to JPEG
thumbnails Creates thumbnails
export Exports photos as JPEG
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug run in debug mode [$PHOTOPRISM_DEBUG]
--config-file FILENAME, -c FILENAME load configuration from FILENAME (default: "/etc/photoprism/photoprism.yml") [$PHOTOPRISM_CONFIG_FILE]
--darktable-cli FILENAME darktable command-line executable FILENAME (default: "/usr/bin/darktable-cli") [$PHOTOPRISM_DARKTABLE_CLI]
--originals-path PATH originals PATH (default: "/var/photoprism/photos/originals") [$PHOTOPRISM_ORIGINALS_PATH]
--thumbnails-path PATH thumbnails PATH (default: "/var/photoprism/photos/thumbnails") [$PHOTOPRISM_THUMBNAILS_PATH]
--import-path PATH import PATH (default: "/var/photoprism/photos/import") [$PHOTOPRISM_IMPORT_PATH]
--export-path PATH export PATH (default: "/var/photoprism/photos/export") [$PHOTOPRISM_EXPORT_PATH]
--assets-path PATH assets PATH (default: "/var/photoprism") [$PHOTOPRISM_ASSETS_PATH]
--database-driver DRIVER database DRIVER (mysql, mssql, postgres or sqlite) (default: "mysql") [$PHOTOPRISM_DATABASE_DRIVER]
--database-dsn DSN database data source name (DSN) (default: "photoprism:photoprism@tcp(localhost:3306)/photoprism") [$PHOTOPRISM_DATABASE_DSN]
--help, -h show help
--version, -v print the version
Example
# ./photoprism import
Importing photos from /photos/import...
Moving main raw file "Canon 6D South Africa 2018/IMG_2171.CR2" to "/photos/originals/2017/12/20171226_093058_8BA53355C9BF.cr2"
Converting "/photos/originals/2017/12/20171226_093058_8BA53355C9BF.cr2" to "/photos/originals/2017/12/20171226_093058_8BA53355C9BF.jpg"
Added main raw file "2017/12/20171226_093058_8BA53355C9BF.cr2"
Added related jpg file "2017/12/20171226_093058_8BA53355C9BF.jpg"
Moving main raw file "Canon 6D South Africa 2018/IMG_2172.CR2" to "/photos/originals/2017/12/20171226_093107_B522D1D35DD7.cr2"
Converting "/photos/originals/2017/12/20171226_093107_B522D1D35DD7.cr2" to "/photos/originals/2017/12/20171226_093107_B522D1D35DD7.jpg"
Added main raw file "2017/12/20171226_093107_B522D1D35DD7.cr2"
Added related jpg file "2017/12/20171226_093107_B522D1D35DD7.jpg"
Moving main raw file "Canon 6D South Africa 2018/IMG_2173.CR2" to "/photos/originals/2017/12/20171226_093117_E1EEE95F488F.cr2"
Converting "/photos/originals/2017/12/20171226_093117_E1EEE95F488F.cr2" to "/photos/originals/2017/12/20171226_093117_E1EEE95F488F.jpg"
Added main raw file "2017/12/20171226_093117_E1EEE95F488F.cr2"
Added related jpg file "2017/12/20171226_093117_E1EEE95F488F.jpg"
Moving main raw file "Canon 6D South Africa 2018/IMG_2174.CR2" to "/photos/originals/2017/12/20171226_093120_9D205FF627B3.cr2"
Converting "/photos/originals/2017/12/20171226_093120_9D205FF627B3.cr2" to "/photos/originals/2017/12/20171226_093120_9D205FF627B3.jpg"
Added main raw file "2017/12/20171226_093120_9D205FF627B3.cr2"
Added related jpg file "2017/12/20171226_093120_9D205FF627B3.jpg"
Deleted empty directory "/photos/import/Canon 6D South Africa 2018"
Done.