diff --git a/README.md b/README.md
index 7d0d13f..22d5623 100644
--- a/README.md
+++ b/README.md
@@ -131,11 +131,24 @@ So, without further ado, here's the current list:
# Photos
-- PhotoPrism
-- PhotoView
-- Piwigo
-- Pixelfed
+- [Comparison table](apps/photos/comparison.md)
+- [PhotoPrism](apps/photos/photoprism.md)
+- [PhotoView](apps/photos/photoview.md)
+- [Piwigo](apps/photos/piwigo.md)
+- [Pixelfed](apps/photos/pixelfed.md)
+## Other tested
+- [Chevereto](https://chevereto.com/) - quite nice. No video support.
+- [Lychee](https://lycheeorg.github.io/) - good looking, no video support.
+- [PhotoShow](https://github.com/thibaud-rohmer/PhotoShow/) - seems dead and doesn't work.
+- [Photosync](https://www.photosync-app.com/home.html) - paid, app, not really self-hosted, just sync.
+- [OwnPhotos](https://github.com/hooram/ownphotos) - limited features, ugly & dead.
+- [FileStash](https://github.com/mickael-kerjean/filestash) - old-time-dropbox-like file manager.
+
+## Untested
+- [pigallery2](https://github.com/bpatrik/pigallery2) - minimal feats
+- [photostructure](https://photostructure.com/) - too early
+- [picapport](https://www.picapport.de/en/index.php) - weird
# Project Management
- Jira
diff --git a/apps/photos/comparison.md b/apps/photos/comparison.md
new file mode 100644
index 0000000..213f56a
--- /dev/null
+++ b/apps/photos/comparison.md
@@ -0,0 +1,13 @@
+# Comparison of self-hosted proto apps
+
+
+| App | UI | Users | Album Sharing | Comments | UI upload | Video support |
+|------------------------|-----------|------------|----------------------------|----------|-----------|----------------------------------------|
+| Piwigo | ⭐️⭐️ | ✅ | user/group permissions | ✅ | ✅ | mp4, m4v, webm, webmv |
+| PixelFed | ⭐️⭐️⭐️⭐️ | ✅ | | ✅ | ✅ | ⛔️ |
+| PhotoView | ⭐️⭐️ | ✅ | unique links with password | ⛔️ | ⛔️ | ✅ |
+| PhotoPrism | ⭐️⭐️⭐️⭐️ | admin only | unique links | ⛔️ | ✅ | allow up/down, but displays thumb only |
+| Chevereto | ⭐️⭐️⭐️⭐️⭐️ | ✅ | permissions, passwords | probably | ✅ | ⛔️ |
+| Lychee | ⭐️⭐️⭐️⭐️⭐️ | ⛔️ | lilnks, passwords | ⛔️ | ✅ | ⛔️ |
+| Synology Moments | ⭐️⭐️⭐️⭐️ | ✅ | links | ⛔️ | ✅ | ✅ |
+| Synology Photo Station | ⭐️⭐️⭐️ | ✅ | links, passwords | ✅ | ✅ | ✅ |
diff --git a/apps/photos/photoprism.md b/apps/photos/photoprism.md
new file mode 100644
index 0000000..6627fc4
--- /dev/null
+++ b/apps/photos/photoprism.md
@@ -0,0 +1,70 @@
+# Photoprism
+
+Personal Photo Management powered by Go and Google TensorFlow.
+
+
+
+- [Github repo](https://github.com/photoprism/photoprism)
+- [Demo](https://demo.photoprism.org/photos)
+
+
+## docker-compose.yml
+```yml
+version: '3.3'
+
+services:
+ photoprism:
+ image: photoprism/photoprism:latest
+ restart: unless-stopped
+ ports:
+ - 2342:2342
+ healthcheck: # Optional
+ test: "photoprism status"
+ interval: 60s
+ timeout: 15s
+ retries: 5
+ environment: # Run "photoprism help" and "photoprism config" too see all config options and current values
+ PHOTOPRISM_DEBUG: "false" # Run in debug mode (shows additional log messages)
+ PHOTOPRISM_PUBLIC: "false" # No authentication required (disables password protection)
+ PHOTOPRISM_READONLY: "false" # Don't modify originals directory (reduced functionality)
+ PHOTOPRISM_UPLOAD_NSFW: "true" # Allow uploads that MAY be offensive
+ PHOTOPRISM_DETECT_NSFW: "false" # Flag photos as private that MAY be offensive
+ PHOTOPRISM_EXPERIMENTAL: "true" # Enable experimental features
+ PHOTOPRISM_SITE_URL: "http://localhost:2342/" # Canonical / public site URL
+ PHOTOPRISM_SITE_TITLE: "PhotoPrism"
+ PHOTOPRISM_SITE_CAPTION: "Browse Your Life"
+ PHOTOPRISM_SITE_DESCRIPTION: ""
+ PHOTOPRISM_SITE_AUTHOR: ""
+ PHOTOPRISM_HTTP_HOST: "0.0.0.0"
+ PHOTOPRISM_HTTP_PORT: 2342
+ PHOTOPRISM_SETTINGS_HIDDEN: "false" # Users can not view or change settings
+ PHOTOPRISM_ADMIN_PASSWORD: "photoprism" # Initial admin password (can be changed in settings)
+ PHOTOPRISM_DATABASE_DRIVER: "mysql" # Using MariaDB or MySQL instead of SQLite is optional
+ PHOTOPRISM_DATABASE_DSN: "photoprism:photoprism@tcp(photoprism-db:3306)/photoprism?charset=utf8mb4,utf8&parseTime=true"
+ # PHOTOPRISM_SIDECAR_JSON: "true" # Read metadata from JSON sidecar files created by exiftool
+ # PHOTOPRISM_SIDECAR_YAML: "true" # Backup photo metadata to YAML sidecar files
+ PHOTOPRISM_THUMB_FILTER: "lanczos" # Resample filter, best to worst: blackman, lanczos, cubic, linear
+ PHOTOPRISM_THUMB_UNCACHED: "false" # Enable on-demand thumbnail rendering (high memory and cpu usage)
+ PHOTOPRISM_THUMB_SIZE: 2048 # Pre-rendered thumbnail size limit (default 2048, min 720, max 7680)
+ # PHOTOPRISM_THUMB_SIZE: 4096 # Retina 4K, DCI 4K (requires more storage); 7680 for 8K Ultra HD
+ PHOTOPRISM_THUMB_SIZE_UNCACHED: 7680 # On-demand rendering size limit (default 7680, min 720, max 7680)
+ PHOTOPRISM_JPEG_SIZE: 7680 # Size limit for converted image files in pixels (720-30000)
+ PHOTOPRISM_JPEG_QUALITY: 90 # Use 95 for high-quality thumbnails (requires more storage)
+ PHOTOPRISM_STORAGE_PATH: "/photoprism/storage" # Storage PATH for generated files like cache and index
+ volumes:
+ - "~/Pictures/Originals:/photoprism/originals" # [local path]:[container path]
+ - "~/Pictures/Import:/photoprism/import" # [local path]:[container path] (optional)
+ - "./storage:/photoprism/storage" # Keep cache, settings and database
+
+ photoprism-db:
+ image: mariadb:10.5
+ restart: unless-stopped
+ command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max-connections=1024 --innodb-rollback-on-timeout=OFF --innodb-lock-wait-timeout=50
+ volumes:
+ - "./db:/var/lib/mysql"
+ environment:
+ MYSQL_ROOT_PASSWORD: photoprism
+ MYSQL_USER: photoprism
+ MYSQL_PASSWORD: photoprism
+ MYSQL_DATABASE: photoprism
+```
diff --git a/apps/photos/photoview.md b/apps/photos/photoview.md
new file mode 100644
index 0000000..29d2261
--- /dev/null
+++ b/apps/photos/photoview.md
@@ -0,0 +1,41 @@
+# PhotoView
+
+Photo gallery for self-hosted personal servers.
+
+
+
+- [Github repo](https://github.com/viktorstrate/photoview)
+
+
+## docker-compose.yml
+```yml
+version: "3"
+services:
+ db:
+ image: mariadb
+ restart: unless-stopped
+ environment:
+ - MYSQL_DATABASE=photoview
+ - MYSQL_USER=photoview
+ - MYSQL_PASSWORD=photo-secret
+ - MYSQL_RANDOM_ROOT_PASSWORD=1
+ volumes:
+ - ./db:/var/lib/mysql
+
+ photoview:
+ image: viktorstrate/photoview:latest
+ restart: unless-stopped
+ ports:
+ - "3090:80"
+ depends_on:
+ - db
+ environment:
+ - MYSQL_URL=photoview:photo-secret@tcp(db)/photoview
+ - API_LISTEN_IP=photoview
+ - API_LISTEN_PORT=80
+ - PHOTO_CACHE=/app/cache
+ - PUBLIC_ENDPOINT=http://192.168.1.10:3090/
+ volumes:
+ - ./cache:/app/cache
+ - ./photos:/photos:ro
+```
diff --git a/apps/photos/piwigo.md b/apps/photos/piwigo.md
new file mode 100644
index 0000000..8767ba8
--- /dev/null
+++ b/apps/photos/piwigo.md
@@ -0,0 +1,40 @@
+# Piwigo
+
+- Has mobile app
+- Some video support
+- Quite complex to manage, but also pretty powerful
+
+
+
+- [Homepage](http://piwigo.org/)
+- [Github repo](https://github.com/Piwigo)
+- [DockerHub repo](https://hub.docker.com/r/linuxserver/piwigo)
+
+
+## docker-compose.yml
+```yml
+---
+version: "2"
+services:
+ piwigo:
+ image: linuxserver/piwigo
+ container_name: piwigo
+ restart: unless-stopped
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Europe/Dublin
+ depends_on:
+ - db
+ ports:
+ - 3060:80
+ volumes:
+ - ./config:/config
+
+ db:
+ image: mariadb
+ restart: unless-stopped
+ environment:
+ - MYSQL_ROOT_PASSWORD=piwigo
+ - MYSQL_DATABASE=piwigo
+```
diff --git a/apps/photos/pixelfed.md b/apps/photos/pixelfed.md
new file mode 100644
index 0000000..0fe0c5f
--- /dev/null
+++ b/apps/photos/pixelfed.md
@@ -0,0 +1,87 @@
+# Pixelfed
+
+Instagram-like photo stream.
+
+
+
+- [Homepage](https://pixelfed.org/)
+- [Github repo](https://github.com/pixelfed/pixelfed)
+- [Docs](https://docs.pixelfed.org/)
+
+## Setup
+
+First create `.env` file like this one: https://github.com/pixelfed/pixelfed/blob/dev/.env.docker
+
+## docker-compose.yml
+```yml
+---
+version: '3'
+services:
+ app:
+ image: pixelfed
+ restart: unless-stopped
+ env_file:
+ - ./.env.docker
+ volumes:
+ - "app-storage:/var/www/storage"
+ - "app-bootstrap:/var/www/bootstrap"
+ - "./.env.docker:/var/www/.env"
+ networks:
+ - external
+ - internal
+ ports:
+ - "8080:80"
+ depends_on:
+ - db
+ - redis
+
+ worker:
+ image: pixelfed
+ restart: unless-stopped
+ env_file:
+ - ./.env.docker
+ volumes:
+ - "app-storage:/var/www/storage"
+ - "app-bootstrap:/var/www/bootstrap"
+ networks:
+ - external
+ - internal
+ command: gosu www-data php artisan horizon
+ depends_on:
+ - db
+ - redis
+
+ db:
+ image: mysql:8.0
+ restart: unless-stopped
+ networks:
+ - internal
+ command: --default-authentication-plugin=mysql_native_password
+ environment:
+ - MYSQL_DATABASE=pixelfed
+ - MYSQL_USER=${DB_USERNAME}
+ - MYSQL_PASSWORD=${DB_PASSWORD}
+ - MYSQL_RANDOM_ROOT_PASSWORD=true
+ volumes:
+ - "db-data:/var/lib/mysql"
+
+ redis:
+ image: redis:5-alpine
+ restart: unless-stopped
+ volumes:
+ - "redis-data:/data"
+ networks:
+ - internal
+
+volumes:
+ db-data:
+ redis-data:
+ app-storage:
+ app-bootstrap:
+
+networks:
+ internal:
+ internal: true
+ external:
+ driver: bridge
+```