The caption of a photo, the sentence saying what is in it, can be stored in three fields: EXIF ImageDescription (0x010E, in IFD0), IPTC Caption-Abstract (dataset 2:120, up to 2,000 bytes) and XMP dc:description. IPTC Core calls the field Description, and Lightroom's Caption field writes it.
[IFD0] ImageDescription : Harbor at dawn from the north pier
[IPTC] Caption-Abstract : Harbor at dawn from the north pier
[XMP-dc] Description : Harbor at dawn from the north pierImageDescription is one of the original TIFF tags that EXIF inherited, an ASCII string with no length limit. dc:description is a lang-alt like dc:rights, so it can hold one caption per language under an x-default entry.
Camera filler
Some cameras put their own text in ImageDescription. Olympus bodies are known for writing OLYMPUS DIGITAL CAMERA into every file. If the value is just the brand name, treat it as empty, and don't let a CMS publish it as a caption.
Alt text is not metadata
The HTML alt attribute is written in the page, not stored in the image. A CMS may prefill a caption field from embedded metadata on upload, but screen readers and search engines read the alt attribute, and browsers ignore the description inside the file. Writing a good ImageDescription does nothing for accessibility on its own.
Editing one copy out of three
Our tools only handle the EXIF copy. The reader shows ImageDescription and the EXIF editor writes it on JPEG and TIFF; Caption-Abstract and dc:description are outside the whitelist. Software that reads the XMP or IPTC copy first may keep showing the old caption. ExifTool's MWG module sets all three at once:
exiftool -use MWG -Description="Harbor at dawn from the north pier" photo.jpgOn a file with no IPTC block, that command writes only the EXIF and XMP copies, because the MWG module doesn't create IPTC from nothing. Add -IPTC:Caption-Abstract="..." if you need the third one.
A caption is not a note to yourself; that is UserComment. Searchable terms go in keywords. The EXIF vs IPTC vs XMP guide explains why the same text gets stored three times.