Immich Memories
Turn your Immich photo library into video memory compilations with music, title screens, and smart cuts.
Immich Memories connects to your self-hosted Immich server, selects the best moments from your videos and photos, and compiles them into shareable memory videos. Year-end recaps, trip highlights, person spotlights, seasonal compilations, monthly highlights, "on this day" flashbacks -- all from a single tool.
Full documentation: sam-dumont.github.io/immich-video-memory-generator
Reference Setup
graph LR
subgraph "Apple M2 Pro – 16GB RAM"
IM["Immich Memories<br/>Python + FFmpeg"]
LLM["omlx (mlx-vlm)<br/>Qwen2.5-VL local"]
end
subgraph "K8s Cluster (GPUs)"
ACE["ACE-Step 1.5<br/>T1000 8GB"]
MG["MusicGen API<br/>GTX 1070 8GB"]
end
subgraph "Synology NAS"
Immich["Immich v2 or v3<br/>Photos + Videos"]
end
IM -->|"API reads<br/>(download clips)"| Immich
IM -->|"Vision analysis<br/>(clip scoring)"| LLM
IM -->|"Background music<br/>(AI-generated)"| ACE
ACE -.->|"fallback"| MG
IM -->|"Upload back<br/>(optional)"| Immich
The LLM runs locally on the Mac via omlx (Apple Silicon MLX). Music generation runs on a K8s cluster with dedicated GPUs. Both are optional — the tool works without them, just without AI clip descriptions and generated music.
Docker (recommended for self-hosters)
# 1. Download the compose file
curl -O https://raw.githubusercontent.com/sam-dumont/immich-video-memory-generator/main/docker-compose.yml
# 2. Set your Immich connection
export IMMICH_URL="http://your-immich-server:2283"
export IMMICH_API_KEY="your-api-key"
# 3. Start
docker compose up -d
# 4. Open http://localhost:8080
Do not expose the default UI as-is. Authentication is disabled by default, and the container listens on
0.0.0.0. Anyone who can reach port 8080 can use it. Enable authentication before publishing the port. The UI is single-user, single-replica; run one instance.
Resource Requirements
| Phase | RAM | CPU | Time estimate |
|---|---|---|---|
| Idle (UI) | ~100MB | minimal | — |
| Analyzing clips | 2-4GB | 2+ cores | ~1 min per 10 clips |
| Encoding (1080p) | 4GB | 4 cores | ~2 min for 5 min video |
| Encoding (4K) | 6-8GB | 4+ cores | ~5 min for 5 min video |
Default Docker limits: 4GB RAM, 4 CPUs. This is not a NAS app — video analysis and encoding need real compute. Best run on a machine with 8GB+ RAM.
Developed and tested on: Apple M2 Pro, 16GB RAM, macOS. Not yet tested on other hardware. If you run it on Linux/x86, Synology, Unraid, or Raspberry Pi — please report your experience.
Supported Immich Versions
Immich Memories supports Immich v2 and v3. Automatic runtime detection is the default:
immich:
api_version: auto # auto | v2 | v3
Leave this on auto. The app detects the server major version and uses the matching API contract;
you do not choose a version for each run. The explicit v2 and v3 values are manual
troubleshooting overrides—escape hatches for proxies or unusual deployments that hide or rewrite
the version endpoint. They force that contract, so don't use them as upgrade flags.
The compatibility layer handles the actual v2-to-v3 breaks: v2 duration strings and v3 millisecond durations both become seconds internally, uploads use the fields accepted by the detected major, and asset search dates include the UTC offset required by v3.
Check the detected API contract and your credentials without generating or uploading anything:
immich-memories config test
Optional: LLM for smart clip analysis
For AI-powered content analysis (identifies what's happening in each clip), point to any OpenAI-compatible vision model:
# In ~/.immich-memories/config.yaml
advanced:
llm:
provider: "openai-compatible"
base_url: "http://your-llm-server:8080/v1"
model: "qwen2.5-vl"
Quick Install
# One-liner (no clone needed)
uvx immich-memories --help
# Or clone and install
git clone https://github.com/sam-dumont/immich-video-memory-generator.git
cd immich-video-memory-generator
uv sync
Quick Start
# 1. Configure
mkdir -p ~/.immich-memories
cat > ~/.immich-memories/config.yaml << EOF
immich:
url: "https://photos.example.com"
api_key: "your-api-key-here"
api_version: auto # auto | v2 | v3
EOF
# 2. Launch the UI
immich-memories ui
# Opens at http://localhost:8080
# 3. Or use the CLI
immich-memories generate --year 2024 --person "John" --output ~/Videos/john_2024.mp4
Key Features
- Videos + Photos — Unified selection pool: videos, photos (Ken Burns / face-aware pan), and Live Photos
- 7 Memory Types — Year in Review, Season, Person Spotlight, Multi-Person, Monthly Highlights, On This Day, Trip
- Smart Clip Selection — Scene detection, interest scoring, duplicate filtering, temporal coverage
- Cinematic Titles — GPU-rendered title screens with globe animations, satellite maps, month dividers
- Face-Aware Cropping — Keeps faces centered when converting aspect ratios
- Hardware Acceleration — NVIDIA NVENC, Apple VideoToolbox, Intel QSV, AMD VAAPI
- AI Music Generation — ACE-Step or MusicGen with automatic mood detection and audio ducking
- Privacy Mode — Blur all video, muffle audio, anonymize GPS/names for demos
- Smart Automation — one daily
auto rundecides what deserves to run, then performs one action - Authentication — Basic auth, OIDC/SSO (Auth0, Authelia, Keycloak), or trusted header proxy
- Web UI + CLI — 4-step wizard or headless automation
- Docker & Kubernetes — Containerized deployment with GPU support
Daily automation
Schedule one daily invocation of immich-memories auto run. It first retries the oldest pending
Immich delivery when a completed output still needs uploading; otherwise it selects and generates
one eligible memory. It never tries to catch up by doing several things in one invocation.
The terminal outcome is skipped, dry_run, completed, or failed. The first three exit 0;
failed exits 1. Use --quiet when a scheduler needs the stable JSON result.
The selector keeps variety on purpose: latest completed month only, at most one monthly review per calendar month, no category twice in a row, and no category more than twice in the last six completed automatic runs. See the auto CLI docs.
Documentation
See the full documentation for:
- Installation (Docker, uv/pip, Kubernetes, Terraform)
- Web UI Walkthrough
- CLI Reference
- Configuration
- Hardware Acceleration
- Audio & Music
- Recipes (birthday compilations, automation, best practices)
Development
make dev # Install all dependencies
make check # Run all checks (lint, format, typecheck, tests)
make ci # Full CI pipeline
make help # Show all available targets
See CONTRIBUTING.md for guidelines.
Built with AI
This entire codebase was written with AI (Claude) as an experiment in building complex software cleanly with AI assistance. 3,900+ tests, 20+ CI quality gates, 225 source modules. See DISCLAIMER.md for the full story.
License
MIT License — see LICENSE for details.
Made with ❤️ for the Immich community
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file immich_memories-0.40.1.tar.gz.
File metadata
- Download URL: immich_memories-0.40.1.tar.gz
- Upload date:
- Size: 4.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb91ed9f78b929f2d79cdb717d617444a18706c6ccac8f7c8fd156a6e991d81f
|
|
| MD5 |
41c696b2c5d299f0ab6b311b91c3339b
|
|
| BLAKE2b-256 |
3d4fe7312102fa7e12f852da5000dd2e61b350caa4eac0db5589e18610b46329
|
Provenance
The following attestation bundles were made for immich_memories-0.40.1.tar.gz:
Publisher:
release.yml on sam-dumont/immich-video-memory-generator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
immich_memories-0.40.1.tar.gz -
Subject digest:
fb91ed9f78b929f2d79cdb717d617444a18706c6ccac8f7c8fd156a6e991d81f - Sigstore transparency entry: 2500403627
- Sigstore integration time:
-
Permalink:
sam-dumont/immich-video-memory-generator@cbb969a4d98aca03dce20e6a0815d8cbd3df8a13 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/sam-dumont
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cbb969a4d98aca03dce20e6a0815d8cbd3df8a13 -
Trigger Event:
push
-
Statement type:
File details
Details for the file immich_memories-0.40.1-py3-none-any.whl.
File metadata
- Download URL: immich_memories-0.40.1-py3-none-any.whl
- Upload date:
- Size: 3.6 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c65d60963ef81945eda8df44938dca1e005b05d60bbe2ff84e83fbfa7647d160
|
|
| MD5 |
bb277b2d506aa54bd7f483f507821793
|
|
| BLAKE2b-256 |
85f66653c50fdc6518cc104440786c7c8e8c0dc45476ed63db72865b6b7f2d1c
|
Provenance
The following attestation bundles were made for immich_memories-0.40.1-py3-none-any.whl:
Publisher:
release.yml on sam-dumont/immich-video-memory-generator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
immich_memories-0.40.1-py3-none-any.whl -
Subject digest:
c65d60963ef81945eda8df44938dca1e005b05d60bbe2ff84e83fbfa7647d160 - Sigstore transparency entry: 2500403638
- Sigstore integration time:
-
Permalink:
sam-dumont/immich-video-memory-generator@cbb969a4d98aca03dce20e6a0815d8cbd3df8a13 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/sam-dumont
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cbb969a4d98aca03dce20e6a0815d8cbd3df8a13 -
Trigger Event:
push
-
Statement type: