This document covers the technical aspects of how Immich-Go processes files, handles metadata, and implements various features.
Immich-go supports same formats as Immich supports, among them:
- JPEG:
.jpg,.jpeg - HEIC/HEIF:
.heic,.heif(Apple formats) - RAW Formats:
.dng,.cr2,.cr3,.arw,.raf,.nef,.rw2,.orf - Other:
.png,.gif,.bmp,.tiff,.webp
- Common:
.mp4,.mov,.avi,.mkv - Mobile:
.3gp,.m4v - Professional:
.mts,.m2ts
- XMP Sidecar:
.xmpfiles - Google Photos:
.jsonmetadata files - Immich Archive:
.JSONmetadata files
Immich-Go automatically excludes several junk patterns. A trailing / means the pattern applies to directories; omit the slash to match files.
| Pattern | Source | Description |
|---|---|---|
@eaDir/ |
Synology NAS | Thumbnail directory |
@__thumb/ |
Synology NAS | Thumbnail directory |
SYNOFILE_THUMB_*.* |
Synology NAS | Thumbnail files |
Lightroom Catalog/ |
Adobe Lightroom | Catalog directory |
thumbnails/ |
Various | Generic thumbnail folder |
.DS_Store |
macOS | Finder metadata file |
/._* |
macOS | Resource fork stubs |
.Spotlight-V100/ |
macOS | Spotlight index folder |
.photostructure/ |
PhotoStructure | Application data |
Recently Deleted/ |
iCloud | Recently deleted items |
- EXIF Metadata: Primary source from image files
- XMP Sidecar: Secondary source from
.xmpfiles - JSON Metadata: From Google Photos or archive files
- Filename Parsing: Last resort extraction from filenames
| Pattern | Example | Format |
|---|---|---|
| ISO Format | 2023-07-15_14-30-25.jpg |
YYYY-MM-DD_HH-MM-SS |
| Timestamp | IMG_20230715_143025.jpg |
IMG_YYYYMMDD_HHMMSS |
| Phone Format | 20230715_143025.jpg |
YYYYMMDD_HHMMSS |
| Screenshot | Screenshot 2023-07-15 at 14.30.25.jpg |
Various patterns |
| Input | Interpretation |
|---|---|
2023 |
January 1, 2023 - December 31, 2023 |
2023-07 |
July 1, 2023 - July 31, 2023 |
2023-07-15 |
July 15, 2023 (single day) |
2023-01-15,2023-03-15 |
Explicit range |
Immich-Go passes XMP files to the Immich server without modification. Immich uses them for:
- Date/Time Information: Capture date and timezone
- GPS Location: Latitude/longitude coordinates
- Tags/Keywords: Hierarchical tag structures
- Descriptions: Photo descriptions and titles
- Technical Data: Camera settings, lens information
Google Photos JSON files contain rich metadata extracted and used by Immich-Go:
{
"title": "IMG_20230715_143025.jpg",
"description": "Family vacation photo",
"imageViews": "1",
"creationTime": {
"timestamp": "1689424225",
"formatted": "Jul 15, 2023, 2:30:25 PM UTC"
},
"geoData": {
"latitude": 37.7749,
"longitude": -122.4194,
"altitude": 0.0,
"latitudeSpan": 0.0,
"longitudeSpan": 0.0
},
"people": [
{
"name": "John Doe"
}
]
}- Albums: Photo album associations
- GPS Coordinates: Location data
- Capture Date: Original photo timestamp
- People Tags: Face recognition names
- Status Flags: Favorite, archived, trashed, partner shared
Immich-Go generates comprehensive JSON metadata for archived photos:
{
"fileName": "example.jpg",
"latitude": 37.7749,
"longitude": -122.4194,
"dateTaken": "2023-10-01T12:34:56Z",
"description": "Golden Gate Bridge view",
"albums": [
{
"title": "San Francisco Trip",
"description": "Photos from my vacation",
"start": "2023-10-01T00:00:00Z",
"end": "2023-10-05T23:59:59Z"
}
],
"tags": [
{
"value": "Location/USA/California/San Francisco"
},
{
"value": "Event/Vacation"
}
],
"rating": 5,
"trashed": false,
"archived": false,
"favorited": true,
"fromPartner": false,
"motion": false,
"livePhoto": false
}- Threshold: Photos taken within 900ms
- Algorithm: Groups consecutive photos below threshold
- Limitations: May group unrelated rapid shots
Pattern: IMG_YYYYMMDD_HHMMSS_BURSTXXX[_COVER].jpg
Example: IMG_20231014_183246_BURST001_COVER.jpg
IMG_20231014_183246_BURST002.jpg
Pattern: PXL_YYYYMMDD_HHMMSSXXX.MOTION-XX.COVER/ORIGINAL.jpg
Example: PXL_20230330_184138390.MOTION-01.COVER.jpg
PXL_20230330_184138390.MOTION-02.ORIGINAL.jpg
Pattern: YYYYMMDD_HHMMSS_XXX.jpg
Example: 20231207_101605_001.jpg
20231207_101605_002.jpg
Pattern: DSC_XXXX_BURSTYYYYMMDDHHMMSSXXX[_COVER].JPG
Example: DSC_0001_BURST20230709220904977.JPG
DSC_0035_BURST20230709220904977_COVER.JPG
Pattern: XXXXXIMG_XXXXX_BURSTXXXXXXXXXXXXX[_COVER].jpg
Example: 00001IMG_00001_BURST1723801037429_COVER.jpg
00002IMG_00002_BURST1723801037429.jpg
- Filename Match: Same name, different extensions
- Directory Location: Must be in same folder
- Timestamp Proximity: Taken within reasonable timeframe
- Size Validation: RAW significantly larger than JPEG
- Canon:
.cr2,.cr3 - Nikon:
.nef - Sony:
.arw - Fujifilm:
.raf - Olympus:
.orf - Panasonic:
.rw2 - Adobe:
.dng
Files:
- IMG_1234.CR3 (RAW)
- IMG_1234.JPG (JPEG)
Result: Paired for stacking/management
Common with Apple devices that shoot in both formats:
Files:
- IMG_1234.HEIC (Apple format)
- IMG_1234.JPG (Compatible format)
Detection: Same basename, different extensions
Specialized handling for Epson FastFoto scanner output:
Files:
- photo-name.jpg (Original scan)
- photo-name_a.jpg (Corrected scan)
- photo-name_b.jpg (Back of photo)
Stacking: All grouped with corrected (_a) as cover
- Checksum Comparison: SHA-1 hash of file content
- Metadata Match: Filename and timestamp comparison
- Size Validation: File size verification
- Skip Logic: Existing files skipped unless
--overwriteused
- Resumable Uploads: Interrupted uploads can be safely restarted
- Multiple Sources: Same photos from different sources handled gracefully
- Storage Efficiency: No unnecessary duplicates on server
- Default: Number of CPU cores
- Range: 1-20 concurrent uploads
- Bottlenecks: Usually network bandwidth, not CPU
Based on testing with various configurations:
| Concurrent Uploads | Network Utilization | Server Load | Reliability |
|---|---|---|---|
| 1 | Low | Minimal | Highest |
| 2-4 | Moderate | Low | High |
| 8-12 | High | Moderate | Good |
| 16+ | Maximum | High | Variable |
- Memory: ~10-50MB per concurrent upload
- Network: Scales linearly with concurrency
- CPU: Minimal impact (I/O bound operation)
archive-folder/
├── 2022/
│ ├── 2022-01/
│ │ ├── IMG_001.jpg
│ │ ├── IMG_001.jpg.JSON
│ │ └── IMG_002.mp4
│ └── 2022-02/
│ └── ...
├── 2023/
│ ├── 2023-01/
│ └── 2023-02/
└── 2024/
├── 2024-01/
└── 2024-02/
- Primary Files: Keep original filenames where possible
- Conflict Resolution: Append numbers for duplicates (
IMG_001(1).jpg) - Character Sanitization: Replace filesystem-incompatible characters
- JSON Sidecar:
original-name.ext.JSON - XMP Preservation: Original
.xmpfiles copied alongside photos
- New Files: Added to appropriate date folders
- Existing Files: Checked for changes, updated if different
- Metadata Updates: JSON files refreshed with current server state
- Deletions: Files not removed from archive (archive-only operation)
- Location: System temp or
IMMICHGO_TEMPDIR - Usage: Minimal temporary storage needed
- Cleanup: Automatic cleanup on exit
This project includes automated monitoring of the Immich API specifications to ensure compatibility:
- Automated Alerts: GitHub Actions workflow monitors daily for API changes
- Manual Checking: Run
./scripts/check-immich-api.shto check for updates - Issue Tracking: Automatic GitHub issues when API changes are detected
- Documentation: See API Monitoring Guide for details
- Configuration - All configuration options
- Commands - Command-specific details
- Best Practices - Performance optimization
- Examples - Practical usage examples