Automatic films
immich-memories auto run is the single daily entry point. It chooses one memory worth making today: a recent trip, a birthday, last month's highlights or a year you have not cut yet. If nothing qualifies, it skips the day.
Make and review a few films manually first. Set home and people, then check Suggestions to see what it would choose.
Docker: switch on the built-in timer
Fetch the models first, or the first fire fails on a missing encoder:
docker compose exec immich-memories immich-memories models fetch
Then, in docker-compose.yml, add these two lines under the app's environment: block:
IMMICH_MEMORIES_AUTOMATION__ENABLED: "true"
IMMICH_MEMORIES_AUTOMATION__DAILY_AT: "09:00"
Change the time there, then recreate the container:
docker compose up -d
The time uses the container's timezone (TZ). Upload is a separate choice: either automation.upload_to_immich: true or upload.enabled: true enables delivery for automatic films. Set upload.album_name for the destination; set automation.album_name instead if automatic films should land in a different album than manual ones, since it wins over upload.album_name for a scheduled run. Leave both upload switches false to keep films on disk. A key missing an upload permission still gets a completed film, kept locally with the reason named; upload permissions and retries covers what happens next.
Or omit those Compose lines and save Settings > Automation > enabled and daily_at. Settings also holds the other automation options; file and environment values win.
Bare metal: auto install
immich-memories auto install --hour 9
This writes a user timer on macOS or Linux and prints its activation command. Run Activate: to start it; installation alone does not activate the schedule. On headless Linux, run loginctl enable-linger "$USER" so the timer survives logout. Run Deactivate: before auto install --uninstall, which only deletes files. Scheduled jobs do not inherit your interactive shell's credentials: keep them in the configuration. A scheduled run keeps its history and logs with the config it was installed with, same as the store, so a second --config never mixes into the main one. On macOS, auto install also re-enables the job's launchd label if an earlier launchctl disable left it off. Scheduler details cover the launcher, environment and missed runs.
Where a scheduled run's logs go
Every attempt that starts a film keeps its full output, credentials redacted, in
~/.immich-memories/cache/automation-output/<attempt-id>.private.log. It's your file (mode 0600):
no sudo, no journal access needed. Runs in the web UI has a download button for it too.
immich-memories auto status # last attempt, outcome and reason
ls -t ~/.immich-memories/cache/automation-output/ | head -1 # newest transcript
That path moves with cache.directory if you changed it. A day skipped before any film starts (cooldown, every candidate rejected) leaves no
transcript: auto status says why.
The scheduler's own wrapper output goes elsewhere. On macOS it lands in
~/.immich-memories/logs/auto.log and auto-error.log. On Linux the systemd unit sends it to your
user journal: journalctl --user -u immich-memories-auto.service works only if your distribution
keeps per-user journals or you're in the systemd-journal group. On a stock Ubuntu account that
answers "insufficient permissions", so read the transcript above instead.
How it picks one memory
It ranks suitable memories and avoids repeating the same category or person too often. That choice selects the subject; the normal editor still chooses the shots. Trips wait until after you are home and birthdays wait a little for phone uploads.
Suggestions shows each reason. Check eligibility previews the checks without rendering, and Run this suggestion asks for that candidate. A manual request still respects the automation rules. A check is a dry run: it shows up in the history, and the day's scheduled film still runs at its time.
Check on it
Open Runs for completed films and failures. On the CLI:
immich-memories auto status
immich-memories auto history --limit 5
For a safe preview:
immich-memories auto run --dry-run
Get told when it runs
Notifications support ntfy, email, Discord and other Apprise targets, off by default. Configure the URLs, then test them:
In Docker, first set IMMICH_MEMORIES_SECRET_KEY in .env
and recreate the container. Then save Settings > Notifications > enabled and urls.
The URLs contain credentials, so saving them needs that encryption key. YAML is another route:
advanced:
notifications:
enabled: true
urls:
- "ntfys://ntfy.sh/my-topic"
immich-memories auto test-notification
The test sends a message to each configured target. The success message comes from any rendered film, manual or automatic; the failure message comes only from the automation runner, and only once it has picked a candidate to run for the day. A day skipped before that (cooldown, no eligible candidate) sends nothing. Thumbnails remain off unless you enable them. Use a private, authenticated ntfy topic: public ones can be read by others. What each message carries covers the full payload.
Trigger it over HTTP
The trigger API is for Home Assistant, shortcuts or another scheduler. It asks automation to choose a memory; it does not film whichever album caused the trigger.
The automation reference covers scores, rotation, delivery retries, tokens, HTTP responses, multi-account scope and Kubernetes. Configuration keys have the defaults.