Workflow

Lightroom Classic round-trip.

SpeedCull is built around the assumption that you already have a workflow. Ratings flow out as standard XMP sidecars, Lightroom Classic reads them, and your existing process continues from there. There’s no plugin, no catalogue integration, no proprietary intermediate format.

What gets synced

SpeedCull stateXMP fieldNotes
1 – 5 ★xmp:Rating="1""5"Standard convention; LR / Bridge / C1 read these directly
Reject flagxmp:Rating="-1"Adobe Bridge / Lightroom convention
UnratedNo xmp:Rating is written at all
Pick flagInternal-only in 0.1; LR round-trip not yet verified
Color labelsNot implemented in 0.1
KeywordsNot implemented in 0.1

On newly-created sidecars SpeedCull also stamps the XMP toolkit attribute (x:xmptk="SpeedCull 0.1.0-mvp") on the wrapper element so you can tell at a glance which sidecars it produced. Existing sidecars’ toolkit attributes are preserved when SpeedCull updates them — only xmp:Rating is touched.

Pre-flight summary

Before any sidecar is written, the Sync screen shows a summary of what’s about to happen:

The XMP write rules

The Sync phase has a few hard rules that come straight out of the source:

1. RAW files are never modified

SpeedCull never opens a RAW file in write mode. Every rating goes into a sibling XMP file. The Sync summary explicitly displays RAW files to modify: 0 as a permanent reminder.

2. Existing sidecars are backed up first

If the target XMP file already exists, SpeedCull copies it to .SpeedCull/backups/xmp-before-sync/<timestamp>_<imageId>_<name>.xmp before any modification. Backups are timestamped per sync run, so multiple syncs don’t overwrite each other’s backups.

3. Only xmp:Rating is touched

When updating an existing sidecar, SpeedCull walks the XMP tree, finds the rdf:Description node, and updates only the xmp:Rating attribute. Every other namespace (dc:, aux:, crs:, etc.), every other attribute, and every child element is preserved exactly as it was.

This is verified by an automated test (XMPTests.testUpdatePreservesUnrelatedFields) that round-trips a complex sidecar with develop settings, keywords, GPS data, and dummy custom namespaces.

4. Unrating removes the field

Setting an image back to 0★ in SpeedCull and re-syncing removes the xmp:Rating attribute from the XMP — it doesn’t set it to "0". This matches Bridge / LR behaviour where “no rating” means absent, not zero.

5. New sidecars use a minimal valid template

For RAWs that don’t already have an XMP sidecar, SpeedCull creates one with the standard x:xmpmeta wrapper (carrying the x:xmptk toolkit attribute), rdf:RDF root, and a single rdf:Description with the xmp:Rating attribute. The <?xpacket?> processing instructions Lightroom expects are written at top and bottom. Lightroom and Bridge both read this without complaint.

Reading the ratings into Lightroom

Once SpeedCull has written sidecars, Lightroom Classic needs to read them. There are three ways depending on whether the folder is already in your catalogue:

A) Folder isn’t in Lightroom yet

  1. In Lightroom: File → Import Photos and Video…
  2. Point at the folder you culled in SpeedCull
  3. Lightroom reads existing XMP sidecars on import — your ratings appear automatically

B) Folder is already in Lightroom

  1. In Lightroom: select the folder in the Library module
  2. Edit → Select All (⌘ A)
  3. Metadata → Read Metadata from Files
  4. Confirm the warning. Lightroom reads each XMP and updates ratings in the catalogue.

C) Per-image refresh

For a single image, right-click in the Library → Metadata → Read Metadata from File. Useful if you want to spot-check one rating before doing a bulk read.

If Lightroom shows a metadata-conflict warning… that means the XMP sidecar disagrees with what Lightroom already has cached. Choose Read Metadata From File to take SpeedCull’s rating, or Overwrite Settings to keep Lightroom’s. If you’re using SpeedCull as your culling app, Read Metadata From File is what you want.

Restoring from a backup

If a sync goes wrong — or you change your mind about a rating after the fact — every XMP sidecar SpeedCull modified has a pre-sync backup in .SpeedCull/backups/xmp-before-sync/.

The Sync screen has a Restore from backup action. It scans the backup directory, groups by timestamp, and lets you walk a backup back into place. Restoration is also a logged action — every restored sidecar is recorded in the sync log with action restored, so you have an audit trail.

Read-only files

If a RAW lives on a read-only mount (archived shoot, cold storage), or the XMP file itself is locked, SpeedCull won’t silently skip it. Instead the sync action is recorded as skipped with a separate read-only count, and the original file stays untouched.

To resolve, copy the shoot to a writable location and re-open the project there, or change the file permissions before re-running Sync.

SpeedCull doesn’t import existing XMP ratings

Heads up: in 0.1, SpeedCull detects existing XMP sidecars during scan (and reports them in the scan summary), but it does not read existing ratings into its catalogue. Every image starts unrated in SpeedCull regardless of what its sidecar says.

That means if you’ve already rated some images in Lightroom and want to continue culling in SpeedCull, those ratings stay where they are — SpeedCull won’t see them, and won’t overwrite them either (since you haven’t given them a new SpeedCull rating to sync).

If you do rate an already-rated image in SpeedCull and sync, the existing XMP gets backed up first (per the rules above) and only xmp:Rating changes. Importing existing ratings from XMP is on the roadmap.

RAW + JPEG pairs

Many cameras can write a RAW and a JPEG simultaneously. SpeedCull detects these pairs during scan and persists the JPEG companion path on the image record, but it does not sync ratings to the JPEG companion in 0.1.

The pair is treated as a single SpeedCull image (the RAW). If you also want the JPEG to carry the rating in Lightroom’s eyes, the easiest path today is to set Lightroom’s Treat JPEG files next to RAW as separate photos preference appropriately and let Lightroom manage the pair.