Skip to main content

uv or pip

For a Mac, a Linux box without Docker, or a checkout you want to hack on. Docker Compose is the recommended install; this one gives the same app with your Python.

You need Python 3.11 or newer and FFmpeg on your PATH:

brew install ffmpeg        # macOS
sudo apt install ffmpeg # Debian, Ubuntu

Install​

Always with an extra. A bare install has no ONNX Runtime, which even NAS needs for its inexpensive picture classifiers.

uv tool install "immich-memories[all]"       # or [all-mac] on Apple Silicon

Tell it where Immich is, in ~/.immich-memories/config.yaml (the key's minimal permissions are on the Docker page):

immich:
url: http://192.168.1.10:2283
api_key: your-api-key

Then fetch the models, check, and start the UI:

immich-memories models fetch                 # about 140 MB, once
immich-memories preflight # Immich, models, output folder, home base
immich-memories ui # http://localhost:8080

Or with pip, in a virtual environment (not your system Python):

pip install "immich-memories[all]"          # or [all-mac] on Apple Silicon

Quote the spec: zsh reads [...] as a glob and fails with no matches found otherwise.

To try it without installing anything: uvx --from "immich-memories[editorial]" immich-memories ui (the classifiers only: [all] adds authentication, generated music and the audio extras). To get uv itself: brew install uv, or curl -LsSf https://astral.sh/uv/install.sh | sh.

models fetch writes the encoder to ~/.immich-memories/models/triage/, the sensitive-content detector to ~/.immich-memories/models/detectors/, the WordNet dictionary to ~/.immich-memories/models/wordnet/, and the document classifier into the Hugging Face cache (~/.cache/huggingface, or advanced.editorial.preparation.detector_cache_dir). Each is checked against a SHA-256. It needs the editorial extra (every all* extra has it).

A cut checks the two ONNX files and the output folder (~/Videos/Memories by default, output.directory to move it) before it asks Immich for anything, and stops with Run immich-memories models fetch if a model is missing. Everything else goes in the same file (Configuration file) or the environment (Environment variables). Then your first film, and who's who once: home base and close family.

Reaching the UI from another machine​

With authentication off, immich-memories ui listens on 127.0.0.1:8080 only. Turn on basic auth or OIDC (Authentication; OIDC needs the auth extra, which [all] has) and it listens on every interface. --host and --port override both (immich-memories ui --host 0.0.0.0 --port 8080), and an explicit --host wins even with authentication off, so only use it that way on a network you trust. Behind a reverse proxy, read the four proxy settings first.

From a checkout​

git clone https://github.com/sam-dumont/immich-video-memory-generator.git
cd immich-video-memory-generator
uv sync --extra editorial # or --extra all-mac on Apple Silicon
make web-client # the web UI, built from web/; needs Node 22
uv run immich-memories ui

uv sync installs into the clone's .venv and puts nothing on your PATH: inside the clone it is always uv run immich-memories .... pip install -e . works too. A checkout is the only install that needs Node: the PyPI wheel and the Docker image ship the web client already built. Skip make web-client and the CLI still works, but /app only tells you to build the client.

Extras​

ExtraWhat it adds
editorialONNX Runtime and Hugging Face Hub, for the context heads and the two detectors. The one you need
editorial-cudaThe same on a CUDA host. Replaces editorial, never joins it
macpyobjc bindings (Quartz, Metal, Vision) for hardware probing. Not enough to cut with alone
musicThe bundled royalty-free track library
audioLocal music metadata (mutagen) for immich-memories music search
authOIDC login (authlib)
demucsLocal Demucs stem separation for music ducking (Torch, about 80 MB of model)
allAll of the above except mac and editorial-cuda
all-maceditorial, mac, music, audio and demucs. No auth: add [all-mac,auth] for OIDC

Never install editorial and editorial-cuda together: onnxruntime and onnxruntime-gpu own the same import name, and the one that answers is whichever pip wrote last.

GPU title rendering needs no extra: its kernel library is a base dependency wherever it publishes a wheel (Title kernels). Local ACE-Step music on a Mac is a checkout job (make install-acestep, then make check-local-audio): Generated music.

exiftool is worth having on an Apple HEIC library: it is the fallback when the Python HDR headroom parser trips on an unusual file. brew install exiftool, or apt install libimage-exiftool-perl.

Daily automation​

immich-memories ui is usually not running all day on a laptop, so the system scheduler runs the daily job. One command writes it: a launchd job on macOS, a systemd user timer on Linux, or a crontab line anywhere else. It then prints the Activate: line to run once, which switches it on.

immich-memories auto install --hour 9     # --uninstall removes it

The job does not inherit your shell's environment, so keep the Immich URL and key in ~/.immich-memories/config.yaml. It refuses to schedule a git worktree or a checkout behind its upstream unless you pass --force. On macOS a missed run happens when the Mac wakes; launchd does not wake it. The hour is the machine's own clock. What it picks each day and why: Automate it.

If you keep immich-memories ui running as a service instead, the built-in timer Docker uses works here too (advanced.automation.enabled: true, daily_at): pick one, not both. Either way the film stays in the output folder unless upload.enabled or advanced.automation.upload_to_immich is on: Upload back to Immich.

What to keep​

~/.immich-memories/store.db is the file that costs a re-read to lose: banked facts, your decisions, people and run history. immich-memories store backup copies it, live, to ~/.immich-memories/backups/; IMMICH_MEMORIES_DATABASE_URL moves the store to PostgreSQL, and then store backup needs pg_dump on your PATH: Database and the store. ~/.immich-memories/cache/ is the part you can delete: Caches.

Logs, health and hardware​

Logs go to the terminal (stderr); -v or --log-level go before the subcommand, and the daily job's own output is kept per attempt: Health, logs and caches. /health/ready answers on the UI's port.

immich-memories hardware prints the encoder it found. A Mac needs nothing: VideoToolbox and Metal are there (Apple Silicon). On Linux, install the VA-API driver or the NVIDIA driver on the host: Hardware encoding.

Add-ons​

The same services as in Docker, each pointed at by URL in config.yaml: a reader, captions, the inference service, a render worker and generated music.

Updating​

uv tool upgrade immich-memories
immich-memories models fetch # a no-op unless a release moved a pin

With pip, keep the extra (pip install --upgrade "immich-memories[all]"). Going back to a release: Rollback.