Personal Photo Management powered by Go and Google TensorFlow

Overview

PhotoPrism: Browse Your Life in Pictures

License: AGPL Code Quality Build Status GitHub contributors Documentation Community Chat Twitter

PhotoPrism® is a privately hosted app for browsing, organizing, and sharing your photo collection. It makes use of the latest technologies to tag and find pictures automatically without getting in your way. Say goodbye to solutions that force you to upload your visual memories to the cloud!

To get a first impression, you're welcome to play with our public demo at demo.photoprism.org.

Key Features

  • Our intuitive user interface makes browsing and organizing your photo collection as easy as it should be — whether it’s on a phone, tablet, or desktop computer.
  • Index everything without worrying about duplicates or RAW to JPEG conversion.
  • Automatic image classification based on Google TensorFlow. In addition, our indexer detects colors, chroma, luminance, quality, panoramic projection, location type, and many other properties.
  • Includes four high-resolution world maps to see where you've been, and for rediscovering long-forgotten shots.
  • WebDAV clients, like Microsoft’s Windows Explorer or Apple's Finder, may connect directly to PhotoPrism so that you to can open, edit, and delete files from your computer or phone as if they were local. You may easily sync your pictures with PhotoSync as well.
  • Because PhotoPrism is built as a progressive web app, it provides a native app-like experience, and you may install it on your home screen. There's also a community-maintained native app in development.

Getting Started

Step-by-step installation instructions for our self-hosted community edition can be found on docs.photoprism.org - all you need is a Web browser and Docker to run the server. It is available for Mac, Linux, and Windows.

We recommend hosting PhotoPrism on a server with at least 2 cores and 4 GB of memory. Beyond these minimum requirements, the amount of RAM should match the number of cores. Indexing large photo and video collections significantly benefits from fast, local SSD storage.

Roadmap

Our vision is to provide the most user-friendly solution for browsing, organizing, and sharing your photo collection. The roadmap shows what tasks are in progress, what needs testing, and which feature requests are going to be implemented next.

Please give ideas you like a thumbs-up 👍 , so that we know what is most popular. Ideas backed by one or more eligible sponsors will be prioritized as well.

Contributions

We welcome contributions of any kind. If you have a bug or an idea, read our guide before opening an issue. Issues labeled help wanted / easy can be good (first) contributions.

Follow us on Twitter to receive regular project updates and discuss development related topics. Don't be afraid to ask stupid questions.

Funding

You're welcome to support us via GitHub Sponsors, especially if you have feature requests or need help with using our software. In addition, you can find us on Patreon and PayPal.

Your continuous support helps...

  • pay for operating expenses and external services like satellite maps
  • developing new features and keeping them free for everyone 🌈

Also, please leave a star on GitHub if you like this project. It provides additional motivation to keep going.

Thank you very much! <3

Ideas backed by one or more eligible sponsors are marked with a golden sponsor label. Let us know if we mistakenly label an idea as unfunded.

Trademarks

PhotoPrism® is a registered trademark of Michael Mayer. You may use it as required to describe our software, run your server, for educational purposes, but not for offering commercial goods, products, or services without prior written permission. In other words, please ask.

Issues
  • Videos: Add transcoding config options

    Videos: Add transcoding config options

    Anytime I browse the library and hit new live photos taken with an iPhone, I end up with gray squares, spinners, and then many (4-8?) ffmpeg processes start up and completely choke my modest PC home server's CPU for 5-15 minutes. Even when uncached thumbnail generation is turned off, processing live photo videos seems to always happen on-demand. This has made a previously satisfactory PhotoPrism instance barely usable.

    According to @lastzero in Gitter:

    When photoprism doesn't know the codec it transcodes via ffmpeg which needs a lot of cpu If we do this upfront, users will complain because of the storage it uses.

    Proposal 1 - two new config options

    Assuming there are two potential issues with live video transcoding (extra disk space used if up-front, and CPU bottleneck on less powerful servers if generated on the spot), a pair of new config options, along with default the live photo feature to "off", might fit most consistently with the existing options.

    PHOTOPRISM_LIVE_PHOTO_TRANSCODE- decides whether these videos are transcoded at all. If true, converts and caches them during indexing/importing. Default: false (saves disk for those who don't need the live photo feature at all)

    PHOTOPRISM_LIVE_PHOTO_TRANSCODE_UNCACHE- if true, transcodes on demand (and either saves them or not? Don't know what's best here). Default: false (saves CPU for those who don't need the feature at all)

    Setting either to true would enable live photos, depending on whether disk or CPU is more important, while avoiding the performance and disk space issues if left off. Open to any feedback on this idea!

    Proposal 2 - live photo transcoding should respect workers option

    It seems like the values of the WORKERS option didn't affect how many ffmpeg processes I saw started at once. If it did, I could set it to 1, and my dual-core server may continue to respond to requests even while slowly generating live videos on demand.

    idea please-test sponsor 
    opened by tommcc 157
  • Docker container support for Raspberry Pi

    Docker container support for Raspberry Pi

    Hi guys,

    I love where this project is going and I'm eager to try it on my Raspberry Pi 3b+. Are you planning on making the docker container suitable for ARM devices?

    Greetings, Thomas

    done todo 
    opened by tjaadvd 76
  • UX: Auto Import / Index

    UX: Auto Import / Index

    I would prefer to automate the import of files that find their way to my Import directory. How about some kind of Import directory polling/watching?

    done idea sponsor 
    opened by p-baum 72
  • Configure thumbnail types and sizes

    Configure thumbnail types and sizes

    first up.. thanks for such a great new app.. I have been looking for something to replace google photos with and tried piwigo, but i like how photoprism is moving along

    I built to run on OSX 10.15 and its running great.

    I tested 150 photos to import, and the originals are 188mb, but the cache thumbs folder is 400mb

    will there in future be a way of limiting the number of created thumbs to a set of sizes? In reality, i would possibly just like one thumb file for grid view, and then if clicked loads the full version image.

    Oz

    done idea sponsor 
    opened by oziee 52
  • Synology: Simplify installation

    Synology: Simplify installation

    Issue 1: Despite having a storage folder configured, it still saves into the orignals folder, these are my mounts image

    (also tried just /storage)

    Issue 2: Password does not work, tried admin and "photoprism" as the password, just tells me its invalid. image

    I assume most of these issues stem from synology's version of docker, any help would be appreciated!

    done idea 
    opened by Bitwolfies 49
  • Index: Rescan doesn't remove deleted folders

    Index: Rescan doesn't remove deleted folders

    I have about 1000 folders (400k photos) in my originals directory, and I deleted (actually moved) about 200 of those to another drive which I don't want to be displayed in Photoprism.

    The folders have been removed, but still show up in the gallery, including the ability to view them.

    How can I remove these from Photoprism altogether? I realize a complete rescan may work, but the first scan took about two weeks! So I don't want to do that again..

    Any advice?

    bug done 
    opened by maltokyo 49
  • Nextcloud: Adding local server yields error 400

    Nextcloud: Adding local server yields error 400

    I am looking to test the PhotoPrism Backup functionality with my local Nextcloud server. Both services are running in Docker containers, and both are exposed and accessible. I am utilizing HTTP rather than the HTTPS, as the endpoints are both contained within my local network.

    When adding the Nextcloud server to PhotoPrism, I am informed that a connection could not be established. Looking over the Logs, I am presented with the following information. I attempted a connection twice

    2020-09-10 11:17:18 DEBU POST /api/v1/accounts (400) [55.223016ms]
    2020-09-10 11:17:18 DEBU api: abort /api/v1/accounts with code 400 (Could not connect, please try again)
    2020-09-10 11:17:18 ERRO could not connect
    2020-09-10 11:17:09 DEBU GET /api/v1/status (200) [43.564µs]
    2020-09-10 11:16:36 DEBU POST /api/v1/accounts (400) [53.83915ms]
    2020-09-10 11:16:36 DEBU api: abort /api/v1/accounts with code 400 (Could not connect, please try again)
    2020-09-10 11:16:36 ERRO could not connect
    2020-09-10 11:16:07 DEBU GET /api/v1/status (200) [50.171µs]
    

    Using Cyberduck, I am able to connect to both PhotoPrism and Nextcloud using WebDAV, confirming that both instances are accessible.

    Cyberduck_2020-09-10_11-29-25 Cyberduck_2020-09-10_11-29-36 image 2020-09-10_12-13-19 2020-09-10_12-14-28 2020-09-10_12-15-11

    bug done 
    opened by Jimmyson 49
  • Implement proof-of-concept Web upload / import

    Implement proof-of-concept Web upload / import

    It should not be required to use the command-line interface to start importing. Users should also be able to upload photos instead of putting them in the import directory directly.

    done important todo 
    opened by lastzero 48
  • CPU and Memory usage high

    CPU and Memory usage high

    Photoprism 20191219 is using 100% cpu on all cores and all of the RAM on docker image startup.

    question 
    opened by kelvinhammond 46
  • Simple video support

    Simple video support

    Shall we support files other than JPEG and RAW? Maybe move all videos to a separate video directory?

    We focus on photos because when you remember something, your brain also uses images, not videos with sound, or not?

    done important sponsor todo 
    opened by lastzero 42
  • Indexing Confidence Levels

    Indexing Confidence Levels

    I really like what you've done here. It's got enough features for me to refine searches of my photo library, and it's faster than a lot of other self-hosted products out there. Great work!

    I've been experiencing some strange labelling though, and a lot of the more erroneous tags are down at the <50% confidence level. Have you got any plans for users to be able to set a threshold confidence level so that anything below a certain amount just doesn't get tagged?

    opened by BackedUpBooty 0
  • Silly question on match logic in func bestLabels

    Silly question on match logic in func bestLabels

    hi there, I am a little confused by the following statements and not sure how we connect the index of probabilities and the size of t.labels

    // bestLabels returns the best 5 labels (if enough high probability labels) from the prediction of the model
    func (t *TensorFlow) bestLabels(probabilities []float32) Labels {
    	var result Labels
    
    	for i, p := range probabilities {
    		if i >= len(t.labels) {
    			// break if probabilities and labels does not match
    			break
    		}
    

    Thanks.

    question 
    opened by guanlisheng 0
  • A few questions regarding auto importer.

    A few questions regarding auto importer.

    As the title suggests,

    • Docs suggest that importer is triggered 15 mins after activity on import folder. If a file is still in upload, what happens in such a case. Does the timer get reset-ed if a file is still in upload because there is still some activity?
    • If I use syncthing to sync to the imports folder, will it be imported 15 mins after sync?

    Thanks a lot for the amazing project.

    question 
    opened by blmhemu 5
  • Cannot close video player on Firefox

    Cannot close video player on Firefox

    System info:

    • Ubuntu 21.04
    • 32GB RAM
    • Ryzen 7 2700X
    • Firefox 90.0

    When launching a video on the demo site (https://demo.photoprism.org/browse?view=mosaic&order=newest&public=true&quality=3) I cannot exit the video player on Firefox. Clicking around the video generates an error in the console but does nothing visually. I can close the video as expected when using Chromium.

    Error:

    TypeError: e.pause is not a function    app.js:2:2368793
        stop https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        onClose https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        click https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        Ue https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        n https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        _wrapper https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
    
        Ge https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        $e https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        je https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        Ue https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        n https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
        _wrapper https://demo-cdn.photoprism.org/static/build/app.js?1f68e8e1:2
    
    bug 
    opened by itsthejoker 3
  • Performance Optimizations

    Performance Optimizations

    As a user I want to have the best performance possible, so that I enjoy scrolling through my library.

    This ticket is meant to collect possible performance optimizations:

    • #1413
    • #1105
    todo 
    opened by graciousgrey 0
  • Downloading multiple files at once is not working on iOS

    Downloading multiple files at once is not working on iOS

    As it turned out in #1436, offering multiple files for downloading at the same time is not handled well by iOS. As of now, an "open with" screen shows up for the first file only.

    There's no path to the next file from that screen, neither does it support handling multiple files (afaik). The only choices are to save/open the file in an app or to return via the browser's "back" button.

    help wanted todo 
    opened by tanuva 1
  • Videos: Skip related images when downloading

    Videos: Skip related images when downloading

    G'day,

    I recently tried to download a video from PhotoPrism (PWA on iOS). What I'm offered looks like the video thumbnail image though, with a file name pattern like video_name.mp4.jpg. I suspect this is not intentional? :)

    Observed on my local installation as well as the PP demo setup.

    bug please-test 
    opened by tanuva 11
  • Adding support for Smart Albums, where new media is added automatically based on conditions

    Adding support for Smart Albums, where new media is added automatically based on conditions

    As a home user I'd like be able to create a Smart Album into which fotos will be added automatically depending on some condition(s).

    i.e. I create a Smart Album "Baby" with the condition "Files which are located in Folder1". Every foto/video located/added to "Folder1" will be automatically added to the album "Baby" without having to insert the newly available files every time into the album.

    Acceptance Criteria:

    • [ ] "Create Smart Album" option MUST be listed when creating an album in the Albums section
    • [ ] "Create Smart Album" option MAY be listed when creating an album based on a folder, adding the condition"File located in this folder".
    • [ ] When creating smart albums it MUST be possible to specify one condition depending on which new fotos/videos will be added automatically to the album.
    • [ ] It SHOULD be possible to specify several conditions of the same type linked with an OR operator (path A or B)
    • [ ] It SHOULD be possible to specify several conditions of different type linked with an OR operator (path A or keyword K)
    • [ ] It MAY be possible to link several conditions with AND or OR operators for complex conditional criteria.
    • [ ] Smart Albums SHOULD be updated at least every 3 hours
    • [ ] The user MAY be able to define a check interval (30 min, 1 hour, 3 hours, 1 day) for adding new fotos matching the conditions to the Smart Album.
    idea 
    opened by cabe1214 0
  • Sharing: Password protection for shared links

    Sharing: Password protection for shared links

    Is there any option to password protect shared links? I know obviously without the exact URL and secret part no one would be able to find it but the option of after clicking the URL to be greeted with a page asking for a password before the shared folder opening would be good.

    Is this already and option or not?

    todo 
    opened by wormvortex 1
  • Bad Gateway on PUT with Photosync iOS App

    Bad Gateway on PUT with Photosync iOS App

    As I have notices the iOS app PhotoSync now supports Photoprim, so I tried it out, and failed miserably with a 502 Bad Gateway...

    Relevant docker-compose logs:

    photoprism    | time="2021-07-10T17:45:27Z" level=debug msg="http: OPTIONS / (200) [4.136171ms]"
    photoprism    | time="2021-07-10T17:45:27Z" level=debug msg="http: MKCOL /______ (200) [4.377806ms]"
    photoprism    | time="2021-07-10T17:45:27Z" level=debug msg="http: MKCOL /______/Zuletzt (200) [3.777106ms]"
    photoprism    | time="2021-07-10T17:45:27Z" level=debug msg="http: PUT /______/Zuletzt/IMG_4442.MOV (200) [3.880059ms]"
    

    Relevant Apache Logs

    ==> /var/log/apache2/photoprism_access.log <==
    2a01:100:2000:xyz:4615 - - [10/Jul/2021:19:47:12 +0200] "OPTIONS / HTTP/1.1" 200 8468 "-" "PhotoSync/372 CFNetwork/1240.0.4 Darwin/20.5.0"
    2a01:100:2000:xyz:4615 - - [10/Jul/2021:19:47:13 +0200] "MKCOL /______ HTTP/1.1" 200 3275 "-" "PhotoSync/372 CFNetwork/1240.0.4 Darwin/20.5.0"
    2a01:100:2000:xyz:4615 - - [10/Jul/2021:19:47:13 +0200] "MKCOL /______/Zuletzt HTTP/1.1" 200 3275 "-" "PhotoSync/372 CFNetwork/1240.0.4 Darwin/20.5.0"
    
    ==> /var/log/apache2/photoprism_error.log <==
    [Sat Jul 10 19:47:13.594598 2021] [proxy:error] [pid 576268:tid 139683792533248] (32)Broken pipe: [client 2a01:100:2000:xyz:54064] AH01084: pass request body failed to 127.0.0.1:2342 (localhost)
    [Sat Jul 10 19:47:13.594648 2021] [proxy_http:error] [pid 576268:tid 139683792533248] [client 2a01:100:2000:xyz:54064] AH01097: pass request body failed to 127.0.0.1:2342 (localhost) from 2a01:100:2000:xyz ()
    
    ==> /var/log/apache2/photoprism_access.log <==
    2a01:100:2000xyz- - [10/Jul/2021:19:47:13 +0200] "PUT /______/Zuletzt/IMG_4442.MOV HTTP/2.0" 502 1627 "-" "PhotoSync/372 CFNetwork/1240.0.4 Darwin/20.5.0"
    
    

    My apache config

    <IfModule mod_ssl.c>
    <VirtualHost *:443>
    	ServerAlias photo.my.tld
    
    	LogLevel warn
    	CustomLog ${APACHE_LOG_DIR}/photoprism_access.log combined
    	ErrorLog ${APACHE_LOG_DIR}/photoprism_error.log
    
    	SSLProxyEngine On
    	SSLProxyVerify none
    	SSLProxyCheckPeerCN off
    	SSLProxyCheckPeerName off
    	SSLProxyCheckPeerExpire off
    #	ProxyPreserveHost on
    	
    	DocumentRoot /var/www/html
    	ProxyPass /.well-known !
    
    	RewriteEngine on
    #	RewriteCond %{HTTP:Upgrade} websocket [NC]
    #	RewriteCond %{HTTP:Connection} upgrade [NC]
    #	RewriteRule ^/?(.*) "ws://localhost:2342/$1" [P,L]
    	
    
    	ProxyPass /api/v1/ws ws://localhost:2342/api/v1/ws
    	ProxyPassReverse /api/v1/ws ws://localhost:2342/api/v1/ws
    	ProxyPass / http://localhost:2342/
    	ProxyPassReverse / http://localhost:2342/
    	ProxyRequests off
    
    	SSLCertificateFile /etc/letsencrypt/live/photo.my.tld/fullchain.pem
    	SSLCertificateKeyFile /etc/letsencrypt/live/photo.my.tld/privkey.pem
    	Include /etc/letsencrypt/options-ssl-apache.conf
    </VirtualHost>
    </IfModule>
    

    Everything else is straight forward. sqlite Databse, and nothing more... Who is behaving wrong here?

    PS.: The explanation for websokets sits different in the local documentation from the community one (as seen in my commented apache config

    Best regards

    question 
    opened by Daywalker01 4
Releases(210523-b1856b9d)
Owner
PhotoPrism
Browse Your Life in Pictures
PhotoPrism
Super fast static photo and video gallery generator (written in Go and HTML/CSS/native JS)

fastgallery Fast static photo and video gallery generator Super fast (written in Go and C, concurrent, uses fastest image/video libraries, 4-8 times f

Toni Melisma 20 Jul 13, 2021
Go package for computer vision using OpenCV 4 and beyond.

GoCV The GoCV package provides Go language bindings for the OpenCV 4 computer vision library. The GoCV package supports the latest releases of Go and

The Hybrid Group 4.2k Jul 24, 2021
Vulkan API bindings for Go programming language

Golang Bindings for Vulkan API Package vulkan provides Go bindings for Vulkan — a low-overhead, cross-platform 3D graphics and compute API. Updated Oc

null 579 May 31, 2021
🔍 Go tool for LSB steganography, capable of hiding any file within an image.

stegify Overview stegify is a simple command line tool capable of fully transparent hiding any file within an image or set of images. This technique i

Dimitar Petrov 938 Jul 15, 2021
S2 geometry library in Go

Overview S2 is a library for spherical geometry that aims to have the same robustness, flexibility, and performance as the best planar geometry librar

Go 1.2k Jul 24, 2021
Storage and image processing server written in Go

Mort An S3-compatible image processing server written in Go. Still in active development. Features HTTP server Resize, Rotate, SmartCrop Convert (JPEG

Marcin Kaciuba 436 Jul 16, 2021
Go package for fast high-level image processing powered by libvips C library

bimg Small Go package for fast high-level image processing using libvips via C bindings, providing a simple programmatic API. bimg was designed to be

Tom 1.5k Jul 23, 2021
An extensive, fast, and accurate command-line image dithering tool.

didder is an extensive, fast, and accurate command-line image dithering tool. It is designed to work well for both power users as well as pipeline scripting. It is backed by my dithering library, and is unique in its correctness and variety of dithering algorithms.

makeworld 61 Jul 5, 2021
🛰️ Clone all your starred GitHub repos

solar ??️ Clone all your starred GitHub repos solar ❓ What is solar? ?? Install ?? macOS ??️ Linux and Windows ?? Commands ??️ solar download ?? Contr

Matt Gleich 22 Jul 22, 2021
An image resizing server written in Go

picfit picfit is a reusable Go server to manipulate images (resize, thumbnail, etc.). It will act as a proxy on your storage engine and will be served

Florent Messa 1.5k Jul 15, 2021
Fast, simple, scalable, Docker-ready HTTP microservice for high-level image processing

imaginary Fast HTTP microservice written in Go for high-level image processing backed by bimg and libvips. imaginary can be used as private or public

Tom 3.8k Jul 24, 2021
Boundary enables identity-based access management for dynamic infrastructure.

Boundary Please note: We take Boundary's security and our users' trust very seriously. If you believe you have found a security issue in Boundary, ple

HashiCorp 2.8k Jul 27, 2021
gensvg generates SVG to an io.Writer

gensvg: A Go library for SVG generation The library generates SVG as defined by the Scalable Vector Graphics 1.1 Specification

Anthony Starks 16 Apr 15, 2021
Go Language Library for SVG generation

SVGo: A Go library for SVG generation The library generates SVG as defined by the Scalable Vector Graphics 1.1 Specification (http://www.w3.org/TR/SVG

Anthony Starks 1.7k Jul 17, 2021