Free and OpenSource Photo Libraries

Overview

In my quest to reduce my reliance upon proprietary software applications, I’ve begun to focus some more time in finding a good Google Photos or Apple Photos alternative. As began looking at the alternatives, I discovered that there were way more options that I had originally anticipated. Each alternative had a different feature set and I found it difficult to compare the different options. To solve this dilemma for myself (and hopefully for many others), I’m compiling a list of free and open source photo libraries that can be self-hosted or run locally without any need for cloud services.

Google/Apple Photos Alternatives

As of the writing of this post, my alternative comparison list looks like the following (Be sure to visit the github repository for the most up to date comparison.

Comparison

✅ = Feature exists in at least a limited fashion
🚧 = Feature may exist but may not be practical or officially released
❌ = Feature does not yet exist
#️⃣ = Subjective measure of feature quality (on scale of 0-10)
Tip: Hover over icons for missing/incomplete features for more information
Feature Damselfly Immich Librephotos Lychee Nextcloud Photos Photonix PiGallery2 Photoprism Photoview Piwigo
Github Stars ? ? ? ? ? ? ? ? ? ?
Active Contributors 1 1 1 3 2 1 1 4 1 3
Source Language C# Dart Python PHP JavaScript Python TypeScript Go Typescript/Go PHP
License ? ? ? ? ? ? ? ? ? ?
Demo 6️⃣* ✅4️⃣ ✅7️⃣ 8️⃣ 8️⃣ 9️⃣ 9️⃣ 9️⃣
Freeness ✅🔟 ✅🔟 ✅🔟 ✅🔟 ✅🔟 ✅🔟 ✅🔟 🚧7️⃣ ✅🔟 ✅🔟
Automatic Mobile Upload ✅7️⃣ ✅4️⃣ ✅6️⃣ ✅7️⃣
Web App ✅8️⃣ ✅8️⃣ ✅8️⃣ ✅8️⃣ ✅5️⃣ ✅7️⃣ ✅7️⃣ ✅7️⃣ ✅8️⃣ ✅8️⃣
Mobile App 6️⃣ 6️⃣ 3️⃣ 4️⃣ 🚧 6️⃣ 7️⃣
Desktop App ✅9️⃣
LivePhotos Support 6️⃣ ✅7️⃣ ✅7️⃣
Video Support ✅8️⃣ ✅8️⃣ ✅6️⃣ ✅6️⃣ ✅8️⃣ ✅7️⃣ ✅7️⃣ ✅4️⃣
Photo Map ✅8️⃣ ✅4️⃣ ✅8️⃣ ✅6️⃣ ✅9️⃣ ✅8️⃣ ✅7️⃣ ✅8️⃣
Photo Discovery ✅7️⃣ ✅3️⃣ ✅6️⃣ ✅1️⃣
Albums ✅8️⃣ ✅9️⃣ ✅8️⃣ ✅3️⃣ ✅5️⃣ ✅6️⃣ ✅8️⃣ ✅6️⃣ ✅8️⃣
Timeline ✅5️⃣ ✅9️⃣ ✅9️⃣ ✅5️⃣ ✅5️⃣ ✅5️⃣ ✅5️⃣ ✅9️⃣ ✅3️⃣
Photo Sharing ✅4️⃣ ✅9️⃣ ✅9️⃣ ✅5️⃣ ✅7️⃣ ✅7️⃣ ✅8️⃣ ✅5️⃣
Photo Search ✅8️⃣ ✅7️⃣ ✅8️⃣ ✅3️⃣ ✅3️⃣ ✅8️⃣ ✅7️⃣ ✅8️⃣ ✅5️⃣ ✅7️⃣
Docker Installation ✅8️⃣ ✅7️⃣ ✅7️⃣ ✅7️⃣ ✅6️⃣ ✅8️⃣ ✅7️⃣ ✅6️⃣ ✅8️⃣
Object/Face Recognition ✅8️⃣ ✅6️⃣ ✅8️⃣ 🚧3️⃣ ✅8️⃣ ✅6️⃣ ✅9️⃣ ✅6️⃣ 🚧
Basic Editing
EXIF Data ✅9️⃣ ✅7️⃣ 3️⃣ ✅7️⃣ ✅7️⃣ ✅7️⃣ ✅9️⃣ ✅7️⃣ ✅7️⃣
Multiple User Support ✅7️⃣ ✅7️⃣ ✅8️⃣ ✅7️⃣ ✅7️⃣ ✅7️⃣ ✅6️⃣ ✅8️⃣

* Librephotos Demo (User:demo Password:demo1234)

Note: This list is by no means comprehensive. For links to other photo library projects, see the Awesome Self-Hosted list.

Contributing

Please contribute additions and corrections by submitting a merge request to the github repository! When contributing, please add links to the source of the information. (i.e. link to an issue that indicates that a feature does not exist)


~ Don’t give away your photos to the largest data collection entities in the world! Your photos document your life better than any other kinds of data. Pictures are worth more than a thousand words to advertisers!

Self-Host Your Browser Data

Overview

For a while now I have been looking for a self-hosted, cross-platform solution that would allow me to sync my browser data (specifically bookmarks and history) between different devices. In the past I’ve used some of the following but have not been entirely satisfied for a number of reasons:

  • iCloud
    • Not self-hosted
    • Required extension (if not using Safari)
    • Did not sync history (if syncing to windows machine)
  • Xmarks
    • Not self-hosted
    • Did not sync history
    • Required extension on all browsers
    • Not mobile-friendly
  • Floccus
    • ✅ Self Hosted
    • Did not sync history
    • Requires extension on all browsers
    • Not mobile-friendly
    • Great for sharing bookmarks with others (Can use Nextcloud as storage)

Firefox Sync Server

Recently I discovered Firefox Sync Server which is an official self-hosted implementation of Mozilla’s sync service for syncing all Firefox account information. Although development on this is low priority, I have proved it to be reliable and well worth the effort to setup. Once configured, all my dreams come true:

  • ✅ Self Hosted & Free!
  • ✅ Cross-platform clients (requires the use of Firefox browsers – which I prefer anyway!)
  • ✅ Mobile Friendly
  • ✅ Syncs any or all of the following: Bookmarks, History, Tabs, Addresses, Credit Cards, Add-Ons, and Firefox Settings

Configure the Server

There are a few different ways to run the Firefox Sync Server but I found Docker-Compose to be the easiest way to get up and running quickly:

1. Setup docker (not covered in this post)
2. Create a new docker-compose (or stack):

version: '3.7'
services:
    syncserver:
        container_name: firefox_syncserver
        image: mozilla/syncserver:latest
        volumes:
            - data:/data
        ports:
            - 5000:5000
        environment:
            SYNCSERVER_PUBLIC_URL: 'https://firefoxsyncserver.your_domain.com'
            SYNCSERVER_SECRET: 'add_a_random_secret_text'
            SYNCSERVER_SQLURI: 'sqlite:////data/syncserver.db'
            SYNCSERVER_BATCH_UPLOAD_ENABLED: 'true'
            SYNCSERVER_FORCE_WSGI_ENVIRON: 'true'
            PORT: '5000'
        restart: always
        
volumes:
    data:

3. Setup remote access to the service. My preferred way is to use a reverse proxy lik NGINXProxyManager.
At minimum you need:
– A static ip or an externally accessible domain (if you don’t have one, you can get one via DuckDNS)
– Port forward the desired port to your Firefox Sync Server

4. Start/deploy the docker container/stack and navigate to the SYNCSERVER_PUBLIC_URL defined in the compose file to verify that the service is running correctly:

Setup Client Browsers

In order to use your self-hosted Firefox Sync Server you will need to configure each client to use your custom sync server:

Desktop Client

Changing the sync server on Firefox desktop is easy:

1. In your address bar navigate to: about:config

2. Search for: identity.sync.tokenserver.uri and modify the value to match the SYNCSERVER_PUBLIC_URL defined in the compose with an additional path of /token/1.0/sync/1.5

3. Sign into your Firefox Account as normal – This is only to authenticate – not to store your browser data. (You can also host your own Firefox Account Server, but that is out of the scope of this post).

4. Attempt to sync. The sync should take at least a few seconds – if it completes immediately, there may be an issue. To tell if the sync properly saved your browser data to your personal server, you can navigate to about:sync-log and browse the log files to make sure your sync server is being referenced instead of the default firefox sync server.

iOS Client

Changing the sync server on Firefox iOS is also easy:

1. Open the iOS Firefox app and navigate to Settings.

2. Scroll to the bottom of the settings pane and tap on “Firefox Daylight” five times quickly (This will enable the advanced/debug menu):

3. Setup the advanced settings according to the screenshots below (be sure to only include the /token/ path for the token server url – you do not need to additional `/1.0/sync/1.5` path that is needed for Firefox desktop. ALSO instead of the url in the screenshot, use accountS.firefox.org for the FxA server (note the S).

4. Sign into your Firefox Account (again this is only used to authenticate – not to store your browser data).

5. Sync your browser data, and confirm that you can see the changes on your other clients that are synced to your same Firefox Sync Server.

Decloud

Once you feel satisfied that your sync server is working correctly and that you have proper backups in place to prevent data loss, go ahead and remove your other sync solutions like (iCloud, Xmarks, etc) and delete the data stored on any of those cloud services. You’re in control of your data now!

~ Don’t litter! – That includes your personal data on the internet!

Uptime Kuma

Overview

Uptime Kuma is a ‘fancy’ self-hosted monitoring service that can be used to create your very own status page of any services you would like to monitor. Initial configuration and setting up monitors is very easy.

Setting Up Uptime Kuma

The preferred method for setting up Uptime Kuma is Docker. And to make the setup in docker even easier, I like to use Portainer:

Create a new stack in Portainer:

version: '3.3'

services:
  uptime-kuma:
    image: louislam/uptime-kuma
    container_name: uptimekuma
    restart: always
    volumes:
      - data:/app/data
    ports:
      - 3001:3001

volumes:
  data:

Start the Stack and Log In

Login Page

Add Monitors

Sample HTTP Monitor

Bonus

You can use a reverse proxy like NGINXProxyManager to fetch an SSL cert and expose the Uptime Kuma service publicly: