Lychee replaces Google Photos with a self-hosted web gallery featuring zero recurring storage fees, password-protected albums, and full EXIF metadata.
Lychee originated in 2013 as a self-hosted PHP photo manager and has evolved across major releases to serve personal image collections. Running on standard web hosting or Docker, it stores pictures in original quality on local drives or network storage. The browser interface helps families and photographers organize, view, and share albums without recurring cloud storage fees.
Google Photos charges recurring monthly subscriptions once photo collections exceed free quotas, turning personal archiving into an escalating expense. Upgrading cloud tiers to store high-resolution mobile pictures and family videos creates an ongoing bill. Lychee eliminates per-gigabyte subscription fees by running on servers you control, such as a home NAS or a low-cost virtual host. Expanding storage requires purchasing physical hard drives once rather than paying monthly cloud rental in perpetuity.
In daily use, Lychee provides core gallery essentials including nested albums, full-screen viewing, tag organization, and password-protected sharing links. What it lacks compared to Google Photos is proprietary machine learning: Lychee does not detect faces, index object searches, or assemble automated video reels. It also omits background mobile camera roll synchronization, meaning uploads occur through a browser or external file sync utilities. For users prioritizing predictable costs and file ownership over corporate convenience, Lychee delivers a focused photo gallery without a subscription paywall.
Lychee vs Google Photos — which should I choose? Google Photos suits users who want hands-off cloud backups with automated facial recognition and zero maintenance. Lychee fits people who want complete ownership of their photo archive on personal storage without recurring subscription fees.
Is Lychee free to use? Yes. The core software is free and open source, while an optional Supporter Edition provides extra perks like user storage quotas and white-labeling for users who contribute to ongoing development.
Can I share albums with people who do not have an account? Yes. Albums can be configured as public or secured with a password, allowing friends and family to view photos via a direct link without creating an account.
Lychee is an effective choice for anyone who wants a clean, self-hosted web gallery to showcase and share family photos without paying monthly cloud storage fees; it is not suited for users who expect automated facial recognition or hands-off mobile camera backups. Active maintenance through September 2026 and an MIT license that keeps your media management free from proprietary lock-in make it a dependable self-hosted photo gallery for personal servers.
We started this exact setup from scratch in a clean Linux machine on Nov 3, 2026 and checked it through Lychee's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p lychee && cd lychee
curl -fsSL https://open-source.store/tools/lychee/compose.yml -o compose.ymlcat > .env <<EOF
APP_KEY=$(openssl rand -base64 32)
APP_URL=http://localhost:8000
DB_PASSWORD=$(openssl rand -hex 12)
DB_ROOT_PASSWORD=$(openssl rand -hex 12)
ADMIN_PASSWORD=$(openssl rand -hex 12)
EOFAPP_KEY — 32-byte base64 encryption key for Laravel sessions and caches. Generated above; keep it secret.APP_URL — Public URL where Lychee is accessible; update with your domain or IP in production.DB_PASSWORD — Password for the Lychee MariaDB database user. Generated above; keep it secret.DB_ROOT_PASSWORD — Root password for the MariaDB database server. Generated above; keep it secret.ADMIN_PASSWORD — Password used during verification smoke checks to create the initial administrator; not read by compose.yml. Generated above; keep it secret.docker compose up -dservices:
lychee_api:
image: ghcr.io/lycheeorg/lychee:v7.12.0
ports:
- "8000:8000"
environment:
PUID: "1000"
PGID: "1000"
APP_KEY: "base64:${APP_KEY}"
APP_NAME: "Lychee"
APP_ENV: "production"
APP_DEBUG: "false"
APP_TIMEZONE: "UTC"
APP_URL: "${APP_URL}"
APP_FORCE_HTTPS: "false"
DB_CONNECTION: "mysql"
DB_HOST: "lychee_db"
DB_PORT: "3306"
DB_DATABASE: "lychee"
DB_USERNAME: "lychee"
DB_PASSWORD: "${DB_PASSWORD}"
SESSION_DRIVER: "file"
SESSION_LIFETIME: "120"
CACHE_STORE: "database"
QUEUE_CONNECTION: "database"
depends_on:
lychee_db:
condition: service_healthy
volumes:
- lychee-uploads:/app/public/uploads
- lychee-logs:/app/storage/logs
- lychee-tmp:/app/storage/tmp
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/up"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
lychee_worker:
image: ghcr.io/lycheeorg/lychee:v7.12.0
environment:
PUID: "1000"
PGID: "1000"
APP_KEY: "base64:${APP_KEY}"
APP_NAME: "Lychee"
APP_ENV: "production"
APP_DEBUG: "false"
APP_TIMEZONE: "UTC"
APP_URL: "${APP_URL}"
APP_FORCE_HTTPS: "false"
DB_CONNECTION: "mysql"
DB_HOST: "lychee_db"
DB_PORT: "3306"
DB_DATABASE: "lychee"
DB_USERNAME: "lychee"
DB_PASSWORD: "${DB_PASSWORD}"
SESSION_DRIVER: "file"
SESSION_LIFETIME: "120"
CACHE_STORE: "database"
QUEUE_CONNECTION: "database"
LYCHEE_MODE: "worker"
depends_on:
lychee_db:
condition: service_healthy
lychee_api:
condition: service_healthy
volumes:
- lychee-uploads:/app/public/uploads
- lychee-logs:/app/storage/logs
- lychee-tmp:/app/storage/tmp
restart: always
healthcheck:
test: ["CMD-SHELL", "pgrep -f 'queue:work' || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
lychee_db:
image: mariadb:11.4.13
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: lychee
MYSQL_USER: lychee
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- lychee-db-data:/var/lib/mysql
restart: always
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 3s
retries: 10
start_period: 10s
volumes:
lychee-uploads:
lychee-logs:
lychee-tmp:
lychee-db-data:
Lint, codegen, breaking-change checks and dependency management in one Git-native CLI. Open source, no registry lock-in.
Show that Lychee is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 73 s: mariadb:11.4.13, ghcr.io/lycheeorg/lychee:v7.12.0, ghcr.io/lycheeorg/lychee:v7.12.0.
Based on the upstream setup. Official compose setup using FrankenPHP with background queue worker and MariaDB 11.4 LTS database. Optional facial recognition sidecar omitted to stay within CPU and memory budget.
lychee_api-1 | 2026-11-03T04:46:29.487185593Z 2026_08_16_000005_add_video_thumbnail_frame_config ............. 0.22ms DONE lychee_api-1 | 2026-11-03T04:46:29.496738135Z 2026_08_17_000001_create_tracks_table .......................... 7.99ms DONE lychee_api-1 | 2026-11-03T04:46:29.497242885Z 2026_08_18_000000_remove_photo_hover_effects_config ............ 0.24ms DONE lychee_api-1 | 2026-11-03T04:46:29.497695968Z 2026_08_18_000001_add_photo_ken_burns_on_hover_config .......... 0.18ms DONE lychee_api-1 | 2026-11-03T04:46:29.498622677Z 2026_08_18_221142_bump_version070704 Warning: Failed to clear cache for version 7.7.4 lychee_api-1 | 2026-11-03T04:46:29.498691010Z ........................... 0.42ms DONE lychee_api-1 | 2026-11-03T04:46:29.499104010Z 2026_08_19_000001_add_photo_ken_burns_on_hover_scale_duration_config 0.19ms DONE lychee_api-1 | 2026-11-03T04:46:29.499708510Z 2026_08_23_180002_bump_version070705 Warning: Failed to clear cache for version 7.7.5 lychee_api-1 | 2026-11-03T04:46:29.499825302Z ........................... 0.36ms DONE lychee_api-1 | 2026-11-03T04:46:29.500289177Z 2026_08_28_000001_add_embed_metadata_config .................... 0.20ms DONE lychee_api-1 | 2026-11-03T04:46:29.508929218Z 2026_08_28_000001_add_title_sorting_columns_to_photos .......... 8.34ms DONE lychee_api-1 | 2026-11-03T04:46:29.516234593Z 2026_08_28_000002_add_title_sorting_columns_to_base_albums ..... 7.05ms DONE lychee_api-1 | 2026-11-03T04:46:29.518061343Z 2026_08_28_000003_backfill_title_sorting_columns_for_photos .... 1.56ms DONE lychee_api-1 | 2026-11-03T04:46:29.518601010Z 2026_08_28_000004_backfill_title_sorting_columns_for_base_albums 0.29ms DONE lychee_api-1 | 2026-11-03T04:46:29.520222302Z 2026_08_28_000005_migrate_sorting_config_to_unified_title ...... 1.35ms DONE lychee_api-1 | 2026-11-03T04:46:29.520907218Z 2026_08_29_124837_bump_version070800 Warning: Failed to clear cache for version 7.8.0 lychee_api-1 | 2026-11-03T04:46:29.520909218Z ........................... 0.39ms DONE lychee_api-1 | 2026-11-03T04:46:29.521363677Z 2026_08_30_093447_fix_sorting_albums ........................... 0.19ms DONE lychee_api-1 | 2026-11-03T04:46:29.521946802Z 2026_08_30_093526_bump_version070801 Warning: Failed to clear cache for version 7.8.1 lychee_api-1 | 2026-11-03T04:46:29.522076468Z ........................... 0.35ms DONE lychee_api-1 | 2026-11-03T04:46:29.522530427Z 2026_08_30_150156_fix_sorting_photos ........................... 0.17ms DONE lychee_api-1 | 2026-11-03T04:46:29.523173343Z 2026_08_30_150404_bump_version070802 Warning: Failed to clear cache for version 7.8.2 lychee_api-1 | 2026-11-03T04:46:29.523180135Z ........................... 0.35ms DONE lychee_api-1 | 2026-11-03T04:46:29.523732343Z 2026_09_01_160530_bump_version070803 Warning: Failed to clear cache for version 7.8.3 lychee_api-1 | 2026-11-03T04:46:29.523804177Z ........................... 0.37ms DONE lychee_api-1 | 2026-11-03T04:46:29.533536427Z 2026_09_05_120001_add_bucket_id_to_albums ...................... 9.38ms DONE lychee_api-1 | 2026-11-03T04:46:29.534059177Z 2026_09_05_120002_add_title_bucket_configs ..................... 0.24ms DONE lychee_api-1 | 2026-11-03T04:46:29.547843593Z 2026_09_05_120003_fix_album_user_thumbs_album_id_type ......... 13.38ms DONE lychee_api-1 | 2026-11-03T04:46:29.548475468Z 2026_09_05_120004_remove_owner_id_album_sorting ................ 0.32ms DONE lychee_api-1 | 2026-11-03T04:46:29.553230760Z 2026_09_05_150001_add_bucket_id_to_photo_album ................. 4.31ms DONE lychee_api-1 | 2026-11-03T04:46:29.553887302Z 2026_09_05_150002_add_photo_title_bucket_configs ............... 0.22ms DONE lychee_api-1 | 2026-11-03T04:46:29.554631927Z 2026_09_06_000000_add_locked_album_cover_configs ............... 0.49ms DONE lychee_api-1 | 2026-11-03T04:46:29.565795635Z 2026_09_07_000000_fix_initial_taken_at_precision .............. 10.88ms DONE lychee_api-1 | 2026-11-03T04:46:29.567035468Z 2026_09_13_000001_add_timeline_lens_config ..................... 0.82ms DONE lychee_api-1 | 2026-11-03T04:46:29.571381302Z 2026_09_15_000001_add_latitude_longitude_index_to_photos ....... 3.91ms DONE lychee_api-1 | 2026-11-03T04:46:29.574232927Z 2026_09_17_000001_add_published_at_orig_tz_to_base_albums ...... 2.54ms DONE lychee_api-1 | 2026-11-03T04:46:29.575075052Z 2026_09_17_134327_bump_version070804 Warning: Failed to clear cache for version 7.8.4 lychee_api-1 | 2026-11-03T04:46:29.575201635Z ........................... 0.53ms DONE lychee_api-1 | 2026-11-03T04:46:29.576211052Z 2026_09_17_210916_bump_version070805 Warning: Failed to clear cache for version 7.8.5 lychee_api-1 | 2026-11-03T04:46:29.576298552Z ........................... 0.53ms DONE lychee_api-1 | 2026-11-03T04:46:29.576973843Z 2026_09_22_000001_rename_search_pagination_limit_to_search_result_limit 0.35ms DONE lychee_api-1 | 2026-11-03T04:46:29.578029385Z 2026_09_23_000000_add_photo_viewer_highest_quality_config ...... 0.24ms DONE lychee_api-1 | 2026-11-03T04:46:29.578610593Z 2026_09_24_000001_add_album_date_scrubber_config ............... 0.24ms DONE lychee_api-1 | 2026-11-03T04:46:29.581112468Z 2026_09_24_000002_add_is_date_scrubber_enabled_to_base_albums .. 2.19ms DONE lychee_api-1 | 2026-11-03T04:46:29.581736260Z 2026_09_24_212329_bump_version070900 Warning: Failed to clear cache for version 7.9.0 lychee_api-1 | 2026-11-03T04:46:29.581854177Z ........................... 0.40ms DONE lychee_api-1 | 2026-11-03T04:46:29.584388218Z 2026_09_25_000000_add_grants_move_to_access_permissions ........ 2.27ms DONE lychee_api-1 | 2026-11-03T04:46:29.585423385Z 2026_09_26_000001_add_size_variant_format_config ............... 0.77ms DONE lychee_api-1 | 2026-11-03T04:46:29.586233468Z 2026_09_26_000002_bound_compression_quality .................... 0.55ms DONE lychee_api-1 | 2026-11-03T04:46:29.586676177Z 2026_09_27_000001_add_gallery_password_config .................. 0.21ms DONE lychee_api-1 | 2026-11-03T04:46:29.587305718Z 2026_09_27_211959_bump_version071000 Warning: Failed to clear cache for version 7.10.0 lychee_api-1 | 2026-11-03T04:46:29.587373760Z ........................... 0.39ms DONE lychee_api-1 | 2026-11-03T04:46:29.587808468Z 2026_09_28_000001_add_video_loop_config ........................ 0.19ms DONE lychee_api-1 | 2026-11-03T04:46:29.589214802Z 2026_09_28_000001_reorder_processing_settings .................. 1.17ms DONE lychee_api-1 | 2026-11-03T04:46:29.589929177Z 2026_09_28_000002_allow_cross_user_same_upload ................. 0.45ms DONE lychee_api-1 | 2026-11-03T04:46:29.590324968Z 2026_09_30_202837_add_landing_background_include_sensitive ..... 0.18ms DONE lychee_api-1 | 2026-11-03T04:46:29.594614843Z 2026_10_02_214703_fix_thumbs ................................... 3.27ms DONE lychee_api-1 | 2026-11-03T04:46:29.595830177Z 2026_10_03_000001_add_pan_zoom_configs ......................... 0.81ms DONE lychee_api-1 | 2026-11-03T04:46:29.599356343Z 2026_10_03_000002_add_live_metrics_created_at_index ............ 3.11ms DONE lychee_api-1 | 2026-11-03T04:46:29.599966885Z 2026_10_03_000002_remove_online_update_configs ................. 0.24ms DONE lychee_api-1 | 2026-11-03T04:46:29.600414718Z 2026_10_03_000003_add_live_metrics_listing_configs ............. 0.19ms DONE lychee_api-1 | 2026-11-03T04:46:29.625292385Z 2026_10_03_000004_add_config_required_keys .................... 24.48ms DONE lychee_api-1 | 2026-11-03T04:46:29.639163968Z 2026_10_03_000005_add_360_columns_to_photos ................... 13.53ms DONE lychee_api-1 | 2026-11-03T04:46:29.640627385Z 2026_10_04_000000_add_pdf_mediabox_max_matches_config .......... 1.16ms DONE lychee_api-1 | 2026-11-03T04:46:29.641266802Z 2026_10_04_124212_fix_missing_statistics_values ................ 0.38ms DONE lychee_api-1 | 2026-11-03T04:46:29.648385593Z 2026_10_12_000000_create_cache_tables .......................... 6.80ms DONE lychee_api-1 | 2026-11-03T04:46:29.657199427Z 2026_10_12_000001_add_bucket_keys_to_photos .................... 8.12ms DONE lychee_api-1 | 2026-11-03T04:46:29.658170593Z 2026_10_12_000002_backfill_photo_taken_and_title_date_keys ..... 0.39ms DONE lychee_api-1 | 2026-11-03T04:46:29.672892510Z 2026_10_12_000003_rename_bucket_id_to_bucket_key .............. 14.33ms DONE lychee_api-1 | 2026-11-03T04:46:29.675056802Z 2026_10_12_000004_backfill_bucket_keys ......................... 1.68ms DONE lychee_api-1 | 2026-11-03T04:46:29.676318802Z 2026_10_13_000000_add_frame_overlay_configs .................... 0.81ms DONE lychee_api-1 | 2026-11-03T04:46:29.691812885Z 2026_10_13_000001_create_photo_moderation_events_table ........ 15.05ms DONE lychee_api-1 | 2026-11-03T04:46:29.692644968Z 2026_10_13_000002_add_moderation_history_configs ............... 0.32ms DONE lychee_api-1 | 2026-11-03T04:46:29.694225802Z 2026_10_13_114623_bump_version071100 Info: Cleared cache for version 7.11.0 lychee_api-1 | 2026-11-03T04:46:29.694318385Z ........................... 1.25ms DONE lychee_api-1 | 2026-11-03T04:46:29.695714260Z 2026_10_13_114626_bump_version071101 Info: Cleared cache for version 7.11.1 lychee_api-1 | 2026-11-03T04:46:29.695810052Z ........................... 0.68ms DONE lychee_api-1 | 2026-11-03T04:46:29.696292468Z 2026_10_13_150000_add_email_login_config ....................... 0.20ms DONE lychee_api-1 | 2026-11-03T04:46:29.696736218Z 2026_10_15_000000_add_face_queue_limit_config .................. 0.18ms DONE lychee_api-1 | 2026-11-03T04:46:29.697239302Z 2026_10_16_000001_add_date_scrubber_format_configs ............. 0.25ms DONE lychee_api-1 | 2026-11-03T04:46:29.698350135Z 2026_10_16_000002_fix_timeline_date_format_defaults ............ 0.83ms DONE lychee_api-1 | 2026-11-03T04:46:29.698771552Z 2026_10_16_000003_add_timeline_hour_multi_day_format ........... 0.18ms DONE lychee_api-1 | 2026-11-03T04:46:29.699201093Z 2026_10_17_000001_add_tag_person_albums_separate_category_configs 0.20ms DONE lychee_api-1 | 2026-11-03T04:46:29.699638760Z 2026_10_18_000001_add_jxl_size_variant_format .................. 0.18ms DONE lychee_api-1 | 2026-11-03T04:46:29.700410802Z 2026_10_22_203450_bump_version071200 Info: Cleared cache for version 7.12.0 lychee_api-1 | 2026-11-03T04:46:29.700508718Z ........................... 0.53ms DONE lychee_api-1 | 2026-11-03T04:46:29.705487552Z lychee_api-1 | 2026-11-03T04:46:29.705704010Z 🧹 Optimizing application... lychee_api-1 | 2026-11-03T04:46:29.798357052Z lychee_api-1 | 2026-11-03T04:46:29.798370843Z INFO Configuration cache cleared successfully. lychee_api-1 | 2026-11-03T04:46:29.798371677Z lychee_api-1 | 2026-11-03T04:46:29.905891885Z lychee_api-1 | 2026-11-03T04:46:29.905905343Z INFO Configuration cached successfully. lychee_api-1 | 2026-11-03T04:46:29.905906760Z lychee_api-1 | 2026-11-03T04:46:30.007862718Z lychee_api-1 | 2026-11-03T04:46:30.007879635Z INFO Route cache cleared successfully. lychee_api-1 | 2026-11-03T04:46:30.007880718Z lychee_api-1 | 2026-11-03T04:46:30.115515552Z lychee_api-1 | 2026-11-03T04:46:30.115527177Z INFO Routes cached successfully. lychee_api-1 | 2026-11-03T04:46:30.115530760Z lychee_api-1 | 2026-11-03T04:46:30.213930552Z lychee_api-1 | 2026-11-03T04:46:30.213962927Z INFO Compiled views cleared successfully. lychee_api-1 | 2026-11-03T04:46:30.213965177Z lychee_api-1 | 2026-11-03T04:46:30.311612719Z lychee_api-1 | 2026-11-03T04:46:30.311767177Z lychee_api-1 | 2026-11-03T04:46:30.311770677Z INFO Blade templates cached successfully. lychee_api-1 | 2026-11-03T04:46:30.311771635Z lychee_api-1 | 2026-11-03T04:46:30.315122135Z ✅ Application ready! lychee_api-1 | 2026-11-03T04:46:30.452068469Z lychee_api-1 | 2026-11-03T04:46:30.452084219Z INFO Server running…. lychee_api-1 | 2026-11-03T04:46:30.452088010Z lychee_api-1 | 2026-11-03T04:46:30.452088635Z lychee_api-1 | 2026-11-03T04:46:30.452113677Z Local: http://0.0.0.0:8000 lychee_api-1 | 2026-11-03T04:46:30.452139802Z lychee_api-1 | 2026-11-03T04:46:30.452143094Z Press Ctrl+C to stop the server lychee_api-1 | 2026-11-03T04:46:30.452156469Z lychee_api-1 | 2026-11-03T04:46:30.631380010Z WARN HTTP/2 skipped because it requires TLS. lychee_api-1 | 2026-11-03T04:46:30.631393135Z lychee_api-1 | 2026-11-03T04:46:30.631560677Z WARN HTTP/3 skipped because it requires TLS. lychee_api-1 | 2026-11-03T04:46:30.631596552Z