Sync Lightroom Classic catalogs to Immich
Project description
lrimmich
Syncs your Lightroom Classic catalog to Immich. Collections become albums, picks become favorites, ratings carry over, and color labels and keywords are written as tags.
The same photo files Lightroom reads must be mounted into Immich as an external library. lrimmich doesn't upload anything. It matches files that are already on both sides and writes metadata through the Immich API.
Install
uv tool install lrimmich
or pipx install lrimmich.
Getting started
lrimmich config init
This writes a starter config to your platform's user config directory:
- Linux:
~/.config/lrimmich/config.toml(XDG) - macOS:
~/Library/Application Support/lrimmich/config.toml - Windows:
%APPDATA%\lrimmich\config.toml
Edit it with your catalog path, Immich URL, API key, and library path (the folder Immich mounts your photos from). See sample_config.toml for all options.
lrimmich doctor
Checks that the catalog opens, the Immich API responds, and at least some files resolve. If it passes, run a dry-run first:
lrimmich sync --dry-run
Commands
lrimmich sync # sync everything
lrimmich sync --dry-run # see what would happen
lrimmich status # exit 1 if there's drift
lrimmich watch # poll for catalog changes, sync when detected
lrimmich adopt # claim existing Immich albums by name match
lrimmich log # show recent sync activity
lrimmich collections # list catalog collections with IDs
lrimmich reset # delete state DB, next sync rebuilds from scratch
lrimmich install-service # generate launchd/systemd unit for periodic sync
lrimmich uninstall-service # remove service files
lrimmich config show # print resolved config (secrets redacted)
lrimmich config edit # open config in your default editor
lrimmich --version # print version
Watch
Watches the catalog file (including WAL) for filesystem events and syncs after a debounce window:
lrimmich watch --debounce 5000
To run it as a background service:
lrimmich install-service --interval 300
How it works
Reads the .lrcat SQLite database, maps LR file paths to Immich asset IDs by scanning the external library folder tree, then diffs against what was synced last time (stored alongside the config in your platform's user state directory). Repeat runs only touch what changed.
Alternatives
| How it works | Uploads photos? | |
|---|---|---|
| lrimmich | CLI tool. Reads the .lrcat database directly, matches files already mounted in Immich, writes metadata only. | No |
| immich-go | CLI tool. Bulk uploads from local folders, Google Photos takeouts, iCloud exports. Handles duplicates and stacking. | Yes |
| lrc-immich-plugin | LR Classic plugin. Export and publish service that uploads rendered photos via the Immich API. Can also import from Immich. | Yes |
| mi.Immich.Publisher | LR Classic plugin. Publishes collections as albums, deduplicates across collections. Beta, not actively maintained. | Yes |
Contributing
Bug reports and PRs welcome. For bugs, include the output of lrimmich doctor and the command you ran. Open an issue at github.com/haavardnk/lrimmich/issues.
License
MIT
Project details
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 lrimmich-0.1.1.tar.gz.
File metadata
- Download URL: lrimmich-0.1.1.tar.gz
- Upload date:
- Size: 65.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fea8c1b9e6e86bb6e915eed380374d40e357bceddd52f754c4ee2b4157bd8d0e
|
|
| MD5 |
48814c886a3ef7e5b370ed32b7079fd3
|
|
| BLAKE2b-256 |
45d8c9049e6857cda2197ea4407f8a2a917fa56afbc17fc4802e87b539a2994e
|
Provenance
The following attestation bundles were made for lrimmich-0.1.1.tar.gz:
Publisher:
ci.yml on haavardnk/lrimmich
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lrimmich-0.1.1.tar.gz -
Subject digest:
fea8c1b9e6e86bb6e915eed380374d40e357bceddd52f754c4ee2b4157bd8d0e - Sigstore transparency entry: 1554446218
- Sigstore integration time:
-
Permalink:
haavardnk/lrimmich@f3fd2d972c1d4f523588f95aabde373c5500b02c -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/haavardnk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@f3fd2d972c1d4f523588f95aabde373c5500b02c -
Trigger Event:
push
-
Statement type:
File details
Details for the file lrimmich-0.1.1-py3-none-any.whl.
File metadata
- Download URL: lrimmich-0.1.1-py3-none-any.whl
- Upload date:
- Size: 32.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
61b45d0b7be083bcafda3e888b628e49d14b6ef0ce4c49a2720eb2ae548df725
|
|
| MD5 |
527aaf21d5da0ad3516eb2e9e22c0903
|
|
| BLAKE2b-256 |
7aabca76950d20ccf2da28070e2521fba84a9f5db7e3479b7c19e0930c3dcbd2
|
Provenance
The following attestation bundles were made for lrimmich-0.1.1-py3-none-any.whl:
Publisher:
ci.yml on haavardnk/lrimmich
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lrimmich-0.1.1-py3-none-any.whl -
Subject digest:
61b45d0b7be083bcafda3e888b628e49d14b6ef0ce4c49a2720eb2ae548df725 - Sigstore transparency entry: 1554446240
- Sigstore integration time:
-
Permalink:
haavardnk/lrimmich@f3fd2d972c1d4f523588f95aabde373c5500b02c -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/haavardnk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@f3fd2d972c1d4f523588f95aabde373c5500b02c -
Trigger Event:
push
-
Statement type: