Bursts & sequences
Reads burst markers like Sony's DSCPDC_0001_BURST and Canon's IMG_0001 and folds a whole sequence into one stack.
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.
$ 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
It reads the same signals your camera used to shoot a series, then picks a parent and stacks the rest behind it.
Reads burst markers like Sony's DSCPDC_0001_BURST and Canon's IMG_0001 and folds a whole sequence into one stack.
Groups assets that share a filename stem and capture time, the pattern most cameras use for a rapid series.
Choose which shot leads each stack by extension, filename pattern, regex, or file size. RAW over JPEG, or the other way round.
The duplicates command scans your library and lists assets that repeat by filename and capture time, so you can act on them.
fix-trash finds trashed assets and moves their stack members along with them, so a stack is never left half-deleted.
Pass comma-separated API keys and it processes multiple Immich users in a single run, ideal for a family server.
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.
# .env
API_KEY=••••••••
API_URL=http://immich:2283/api
RUN_MODE=cron
CRON_INTERVAL=60
# then
docker run --env-file .env … immich-stack
It reorganizes stacks, not your photos. The destructive paths all ask first.
See exactly which stacks it would build and which parent it would pick before a single change is written.
Stack replacement rebuilds groups cleanly on each run instead of layering new stacks on top of old ones.
Clearing every stack is possible, but the command asks for explicit confirmation first. No accidental wipes.
It only calls your Immich REST API to create and group stacks. It never edits files or touches the database directly.
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
Set API_KEY and API_URL for your server, plus RUN_MODE and CRON_INTERVAL.
Start it from Docker Hub or GHCR with docker run --env-file .env, mounting a ./logs volume.
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.
Yes. Immich Stack is open source under the MIT license. Pull the Docker image from Docker Hub or GHCR, or build it yourself.
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.
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.
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.
Yes. Pass comma-separated API keys and it processes each Immich user in a single run.
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
Run it once to tidy the backlog, then leave it on a schedule so new sequences never sprawl again. MIT licensed, yours to build.