One burst, ten frames
Your timeline sees one

Immich Stack finds the burst sequences and RAW+JPEG pairs sprawled across your library and folds each one into a clean stack, on its own, on a schedule.

immich-stack · cron

$ docker logs -f immich-stack

INFO 1/24 Key: IMG_4821.jpg

INFO Parent ID=9f2c81b4-… Name=IMG_4821.jpg Time=2024-03-14T16:02:11

INFO Child ID=c07d55e2-… Name=IMG_4821.arw Time=2024-03-14T16:02:11

INFO 🆕 Creating new stack

INFO 2/24 Key: IMG_5033.jpg

INFO Parent ID=4b8e19d7-… Name=IMG_5033.jpg Time=2024-03-14T16:04:27

INFO Child ID=71acd903-… Name=IMG_5034.jpg Time=2024-03-14T16:04:27

INFO Child ID=e5f02b61-… Name=IMG_5035.jpg Time=2024-03-14T16:04:28

INFO 🆕 Creating new stack

INFO 3/24 Key: DSC08812.jpg

INFO Parent ID=0d97c2ae-… Name=DSC08812.jpg Time=2024-03-14T16:07:03

INFO Child ID=b64f8e15-… Name=DSC08812.arw Time=2024-03-14T16:07:03

INFO ✏️ Updating stack configuration

INFO Sleeping for 60 seconds until next run

DOCKER · CRON-READY · MULTI-USER · DRY-RUN SAFE · MIT

What it groups, and how

It reads the same signals your camera used to shoot a series, then picks a parent and stacks the rest behind it.

Bursts & sequences

Reads burst markers like Sony's DSCPDC_0001_BURST and Canon's IMG_0001 and folds a whole sequence into one stack.

Filename + time

Groups assets that share a filename stem and capture time, the pattern most cameras use for a rapid series.

Pick the parent

Choose which shot leads each stack by extension, filename pattern, regex, or file size. RAW over JPEG, or the other way round.

Duplicates report

The duplicates command scans your library and lists assets that repeat by filename and capture time, so you can act on them.

Trash stays consistent

fix-trash finds trashed assets and moves their stack members along with them, so a stack is never left half-deleted.

Every user at once

Pass comma-separated API keys and it processes multiple Immich users in a single run, ideal for a family server.

It runs on cron, not on you

Point it at your server once and run it in cron mode. Every interval it scans for new sequences, rebuilds stacks cleanly, and logs exactly what it did. No babysitting.

  • Runs as a Docker container in cron mode, on the interval you set
  • Colorized, structured logs at the verbosity you choose
  • Dry-run and a confirmation-gated reset keep destructive actions deliberate

# .env
API_KEY=••••••••
API_URL=http://immich:2283/api
RUN_MODE=cron
CRON_INTERVAL=60

# then
docker run --env-file .env … immich-stack

Deliberate by default

It reorganizes stacks, not your photos. The destructive paths all ask first.

Dry-run first

See exactly which stacks it would build and which parent it would pick before a single change is written.

Replace, don't pile up

Stack replacement rebuilds groups cleanly on each run instead of layering new stacks on top of old ones.

Reset is gated

Clearing every stack is possible, but the command asks for explicit confirmation first. No accidental wipes.

Just the API

It only calls your Immich REST API to create and group stacks. It never edits files or touches the database directly.

Running in three steps

Fill in a .env, start the container, and follow the logs.

$ docker run -d \
--name immich-stack \
--env-file .env \
-v ./logs:/app/logs \
ghcr.io/majorfi/immich-stack

$ docker logs -f immich-stack

  1. 1

    Create a .env

    Set API_KEY and API_URL for your server, plus RUN_MODE and CRON_INTERVAL.

  2. 2

    Run the container

    Start it from Docker Hub or GHCR with docker run --env-file .env, mounting a ./logs volume.

  3. 3

    Watch it group

    Follow a run with docker logs -f. Start with a dry-run, then let cron take over on your interval.

Every option is covered in the full documentation.

Fair questions

Is it free?

Yes. Immich Stack is open source under the MIT license. Pull the Docker image from Docker Hub or GHCR, or build it yourself.

Will it group photos that aren't related?

No. It groups by filename stem, capture time and burst markers, the same signals a camera uses for a sequence. You choose the parent rule, and dry-run shows every group before anything is written.

Can it delete my photos?

It creates and replaces stacks, not photos. The fix-trash command only moves stack members of already-trashed assets to the trash for consistency, and the full reset is confirmation-gated.

Does it keep running?

In cron mode it runs on your CRON_INTERVAL inside Docker, so new bursts get stacked automatically. You can also run it once and let it exit.

Can it handle several users?

Yes. Pass comma-separated API keys and it processes each Immich user in a single run.

Is this an official Immich tool?

No. It's an independent open-source companion that talks to Immich's public REST API. Immich is a trademark of its respective owners.

Free & open source

Let your bursts collapse into stacks

Run it once to tidy the backlog, then leave it on a schedule so new sequences never sprawl again. MIT licensed, yours to build.