Skip to main content

EXIF tags

During the Metadata Extraction job, Immich reads metadata from each asset with ExifTool and, for videos, supplements it with stream information from ffprobe. This page lists which tags feed which feature.

Where several tags are listed for one field, they are tried in order and the first one present is used. Tags read from an XMP sidecar take precedence over tags embedded in the asset itself.

Date and time

The asset's date is taken from the first of these tags that contains a valid date:

  1. SubSecDateTimeOriginal
  2. SubSecCreateDate
  3. DateTimeOriginal
  4. CreationDate
  5. CreateDate
  6. MediaCreateDate
  7. DateTimeCreated
  8. GPSDateTime
  9. DateTimeUTC
  10. SonyDateTime2
  11. SourceImageCreateTime — undocumented, non-standard tag written by Insta360 in the xmp.GPano namespace

If none of them yields a date, Immich falls back to the earliest of the file's creation and modification times. This is why assets with no date metadata often show up dated by when the file was copied or created.

The time zone comes from the offset on whichever date tag was used. A raw value ending in Z or +00:00 is treated as UTC+0. If no zone can be determined, the timestamp is stored as-is and treated as local time.

Location

FieldTags
Latitude and longitudeGPSLatitude, GPSLongitude

Coordinates are ignored when both values are 0, which is how many devices write "no fix". City, state, and country are not read from the file — they are derived from the coordinates by reverse geocoding.

Camera and lens

FieldTags (in order)
MakeMake, Device.Manufacturer, AndroidMake, DeviceManufacturer
ModelModel, Device.ModelName, AndroidModel, DeviceModelName
Lens modelLensID, LensType, LensSpec, LensModel
ISOISO
Exposure timeExposureTime
ApertureFNumber
Focal lengthFocalLength
Frame rateffprobe frame rate, else VideoFrameRate

A lens model of ----, or one beginning with Unknown, is discarded rather than stored.

Image properties

FieldTags (in order)
DimensionsImageSize, else ImageWidth and ImageHeight
OrientationOrientation
Projection typeProjectionType
Bits per sampleBitsPerSample, ComponentBitDepth, ImagePixelDepth, BitDepth, ColorBitDepth
Color spaceColorSpace
DurationDuration

ImageSize is preferred because for RAW formats such as CR2 and RAF, ImageWidth and ImageHeight describe the embedded preview rather than the image itself.

When Orientation indicates the image is rotated a quarter turn, the stored width and height are swapped so the asset's dimensions match how it is displayed.

A bit depth of 24 or more that divides evenly by three is treated as a per-pixel value and divided by three to get bits per channel.

ProjectionType is what marks an asset as a 360° photo.

Description and rating

FieldTags (in order)
DescriptionImageDescription, Description
Profile descriptionProfileDescription
RatingRating

Ratings are accepted in the range 1–5; a rating of 0 is stored as no rating.

Tags

FieldTags (in order)Used for
TagsTagsList, HierarchicalSubject, KeywordsTagging, including hierarchy

Only the first of the three that is present is used — they are not merged. TagsList (written by digiKam and others) is the preferred source because it already carries hierarchy. HierarchicalSubject (written by Lightroom) is converted as described below, and Keywords is a flat list.

Hierarchical tags

Immich stores tag hierarchy in a single string per tag, using / as the level separator. When a tag is applied, the value is split on / and every level is created as a real tag, with each level parented to the one before it.

The tag Nature/Birds/Owl therefore produces three tags:

Tag valueParent
Nature
Nature/BirdsNature
Nature/Birds/OwlNature/Birds

and the asset is assigned the deepest one, Nature/Birds/Owl. Empty segments are dropped, so Nature//Owl is the same as Nature/Owl.

HierarchicalSubject uses | as its separator instead, so its values are converted on import:

  • | becomes /, making each level a level in Immich.
  • A literal / already inside a level is replaced with |, so it does not create an unintended extra level.

For example, Lightroom's Travel|Roadtrip 2024|Route 66/Arizona is imported as Travel/Roadtrip 2024/Route 66|Arizona — three levels, with the slash in the last one preserved as a |.

Because splitting happens on the way in, a flat Keywords entry that happens to contain a / is also treated as a hierarchy.

Grouping

FeatureTags (in order)
Live photo pairingContentIdentifier, MediaGroupUUID
Automatic stackingBurstID, BurstUUID, CameraBurstID, MediaUniqueID
Motion photo detectionMotionPhoto, MicroVideo, MicroVideoOffset, MotionPhotoVideo, EmbeddedVideoType, EmbeddedVideoFile, ContainerDirectory

Live photo pairing matches a still and a video that share the same identifier. Automatic stacking groups assets that a camera wrote with the same burst identifier. For motion photos, the embedded video is extracted into a separate asset and linked to the still.

Faces

FieldTag
Tagged facesRegionInfo

RegionInfo is only read when Import faces from metadata is enabled in the machine learning settings. It is used when it contains both AppliedToDimensions and a non-empty RegionList; region coordinates are interpreted as normalized values per the MWG guidelines and are rotated to match the asset's Orientation.

Tags Immich writes

The Sidecar Write job writes these tags back to the asset's .xmp sidecar:

TagSource
Description, ImageDescriptionThe asset's description
DateTimeOriginalThe asset's date and time
GPSLatitude, GPSLongitudeThe asset's location
RatingThe asset's rating
TagsListThe asset's tags

Nothing is written back into the original file. See XMP Sidecars for how sidecar files are discovered and named.