The top folder is named in your account's language
Unzip a part and you get a Takeout folder with one folder inside it for photos. Its name is localized. immich-go's documentation lists the names it has seen:
| Folder | Language |
|---|---|
Google Photos | English and French |
Google Foto | Italian |
Google Fotos | German |
Fotky Google | Slovak |
Google Фото | Russian |
Google Снимки | Bulgarian |
FixMyTakeout recognizes each of these and strips the Takeout/… prefix, so files dropped from an extracted folder line up with files read straight from the zips. Any other name is treated as a plain folder and still works.
Names from immich-go, docs/misc/google-takeout.md.
Year folders and album folders sit side by side
Inside the photos folder there are two kinds of subfolder. Photos from 2019, Photos from 2020 and so on hold everything by the year it was taken. Every album you made is a sibling folder with the album's name, and it holds a second copy of each photo in it. GooglePhotosTakeoutHelper_Neo also knows the year-folder prefixes Fotos del, Fotos von, Foto da and Foto_s van, although immich-go's documentation shows an Italian export whose year folders were still called Photos from.
An album folder also carries a small JSON describing the album, named metadata.json in English and métadonnées.json, Metadaten.json, metadati.json, metadatos.json, metadades.json, metadáta.json, метаданные.json or метаданни.json in other languages. It describes the album, not a photo, and FixMyTakeout ignores it. The two projects tell photo JSON and album JSON apart by content rather than by name: a photo's JSON has a photoTakenTime, an album's has only a title. FixMyTakeout does the same. The repeated copies, and what you can do about them, are on the album folders page.
What each field in a photo's JSON means
Next to IMG_2710.HEIC you will find IMG_2710.HEIC.supplemental-metadata.json (or IMG_2710.HEIC.json in exports made before late 2024). These are the fields inside it, taken from real sidecars in the immich-go tests and issue tracker.
| Field | What it holds | What FixMyTakeout does with it |
|---|---|---|
title | The name the file had when it was uploaded. It can differ from the name on disk and can lack an extension. | Used as a last resort to pair a file with its JSON, only when exactly one JSON in the folder carries that name. |
description | The caption you typed in Google Photos. | Written into the file as its description. |
photoTakenTime | timestamp (epoch seconds, UTC) and formatted (text). The moment the photo was taken. | The capture date. See why exports show the wrong date. |
creationTime | When the item was uploaded to Google Photos. | Ignored. None of the importers use it for the date, and neither does FixMyTakeout. |
modificationTime | Present only in old exports. | Ignored. |
geoData | latitude, longitude, altitude and two span values. Exactly 0, 0 when there is no location. | Written as the file's GPS position when the file has none. 0, 0 is treated as no location. |
geoDataExif | The same shape; the position that was in the file's own EXIF when it was uploaded. | Used only to pick the time zone when geoData is empty. |
people | Names of the people Google Photos recognized. | Not written. |
favorited | Whether you starred it. | Not written. |
url | A link to the item in Google Photos. Missing in old exports. | Ignored. |
imageViews | A view count, as a string. | Ignored. |
googlePhotosOrigin | Either mobileUpload, with the phone's folder name and a device type such as ANDROID_PHONE or IOS_PHONE, or fromPartnerSharing for photos a partner shared with you. | Ignored. |
Field list from immich-go's json_test.go fixtures and issue #652.
The timestamp is epoch seconds in UTC, and the text next to it is not worth parsing
A real value looks like "timestamp": "1697872351" with "formatted": "21 oct. 2023, 07:12:31 UTC". The formatted text is in the language of the account, so the same export can say 11 sie 2017, 08:20:26 UTC or Oct 27, 2023, 4:33:03 PM UTC. immich-go deliberately parses only the number. So does FixMyTakeout.
The JSON carries no time zone for the capture. A comment in immich-go issue #652 (February 2025) puts it plainly: the sidecar "does not contain timezone information". A photo taken at 09:12 in Lisbon and one taken at 10:12 in Madrid the same morning have the same timestamp. The zone has to come from somewhere else, and on FixMyTakeout it comes from the photo's coordinates when it has them, or from a zone you choose.
One folder can be spread across several zip parts
Takeout splits an export into parts of the size you asked for, and one folder's files can land in different parts. In immich-go issue #380 a photo's JSON sat in part 003 while the photo itself was in part 004, and the album's metadata file appeared in both part 001 and part 009. Any tool that opens one zip at a time will report that photo as having no JSON.
FixMyTakeout indexes the JSON files from every part you add, grouped by folder, before it looks at a single photo. Add all the parts in one go and a photo in part 004 finds its sidecar in part 003. If you add the same part twice the repeat is skipped.
The names that trip up importers
- The .supplemental-metadata suffix and the 51-character cut: why
Screenshot_20231027_123303_Facebook.jpggets a JSON ending in.supple.json. - Duplicate numbers:
IMG_2710(1).HEICpairs withIMG_2710.HEIC(1).json, and the two names that must never match. - Edited copies:
-edited,-bearbeitet,-modifiéand friends, and what they inherit. - Live Photos and motion photos: the MP4 with no JSON of its own, and Pixel
.MPparts. - Album folders: the same photo three times, and albums that contain only JSON.
- Missing and wrong dates: where the date actually is, and what happens to files with no JSON at all.
Look inside your own export
- Open any zip part and go into
Takeout, then the photos folder, then aPhotos fromyear. - Open one
.jsonfile in a text editor. FindphotoTakenTimeand compare itsformattedtext withcreationTime. When they differ by months or years, that gap is what your photo app has been showing you. - Look at the JSON names next to long file names. Once a name plus
.supplemental-metadata.jsonpasses 51 characters, the suffix is cut short.