Skip to content

upload

Upload photos and videos to your Immich server from various sources.

Synopsis

bash
immich-go upload [source-flags] [options] <paths>...

Source Modes

FlagSourceDescription
(default)Local filesystemUpload from folders or ZIP archives
--googleGoogle TakeoutImport Google Photos takeout
--icloudiCloud exportImport iCloud takeout
--picasaPicasaParse .picasa.ini files for albums
--from-immichImmich serverTransfer from another Immich instance

Mutually Exclusive

--google, --icloud, and --from-immich cannot be combined. --picasa can be used with folder mode.

Server Connection

OptionRequiredDefaultDescription
-s, --serverYes-Immich server URL
-k, --api-keyYes-API key
--admin-api-keyNo-Admin API key (for job control)
--skip-verify-sslNofalseSkip SSL certificate verification
--client-timeoutNo20mRequest timeout

Behavior

OptionDefaultDescription
--dry-runfalseSimulate without uploading
--concurrent-tasksCPU coresParallel uploads (1-20)
--overwritefalseReplace existing files
--pause-immich-jobstruePause server background jobs
--on-errorsstopstop, continue, or error count

Output

OptionDefaultDescription
--outputtexttext or json
--api-tracefalseLog API calls

Tagging

OptionDefaultDescription
--session-tagfalseTag with upload timestamp
--tag-Custom tags (repeatable)
--device-uuid$LOCALHOSTDevice identifier

Folder Mode (Default)

Upload from local folders or ZIP archives.

Options

OptionDefaultDescription
--recursivetrueProcess subfolders
--date-from-nametrueExtract date from filename
--ignore-sidecar-filesfalseSkip XMP sidecars

File Filtering

OptionDefaultDescription
--include-extensionsallOnly these extensions
--exclude-extensions-Skip these extensions
--include-typeallIMAGE, VIDEO, or all
--ban-filedefaultsExclude by pattern
--date-range-Filter by date

Albums

OptionDefaultDescription
--folder-as-albumNONEFOLDER, PATH, or NONE
--folder-as-tagsfalseUse folders as tags
--into-album-Put all in this album
--album-path-joiner" / "Separator for PATH mode

Stacking

OptionValuesDescription
--manage-raw-jpegNoStack, KeepRaw, KeepJPG, StackCoverRaw, StackCoverJPGRAW+JPEG handling
--manage-heic-jpegNoStack, KeepHeic, KeepJPG, StackCoverHeic, StackCoverJPGHEIC+JPEG handling
--manage-burstNoStack, Stack, StackKeepRaw, StackKeepJPEGBurst handling
--manage-epson-fastfotofalseEpson FastFoto scans

Examples

bash
# Basic upload
immich-go upload --server=http://localhost:2283 --api-key=key /photos

# Create albums from folders
immich-go upload --folder-as-album=FOLDER --server=... --api-key=... /photos

# Stack RAW+JPEG
immich-go upload --manage-raw-jpeg=StackCoverRaw --server=... --api-key=... /photos

# Filter by date and type
immich-go upload --date-range=2023 --include-type=IMAGE --server=... --api-key=... /photos

# JSON output
immich-go upload --output=json --server=... --api-key=... /photos

Google Photos Mode

Upload from Google Photos Takeout archives.

bash
immich-go upload --google [options] <takeout-path>

The path can be:

  • One or more takeout-*.zip files
  • A decompressed takeout folder
  • A directory containing takeout zip files (auto-detected)

Options

OptionDefaultDescription
--include-unmatchedfalseImport files without JSON metadata
--include-archivedtrueImport archived photos
--include-trashedfalseImport trashed photos
--include-partnertrueImport partner's photos
--sync-albumstrueCreate matching albums
--include-untitled-albumsfalseInclude untitled albums
--from-album-name-Import only this album
--partner-shared-album-Album for partner photos
--takeout-tagtrueTag with takeout timestamp
--people-tagtrueTag with people names

Examples

bash
# Basic import
immich-go upload --google --server=... --api-key=... /path/to/takeout-*.zip

# Import from folder of zips
immich-go upload --google --server=... --api-key=... /path/to/takeout-folder

# Specific album only
immich-go upload --google --from-album-name="Vacation" --server=... --api-key=... /takeout

iCloud Mode

Upload from iCloud exports.

bash
immich-go upload --icloud [options] <icloud-path>

Options

OptionDefaultDescription
--memoriesfalseImport memories as albums

Example

bash
immich-go upload --icloud --memories --server=... --api-key=... /icloud-export

Immich-to-Immich Mode

Transfer between Immich servers.

bash
immich-go upload --from-immich [source-options] [destination-options]

No Path Argument

This mode doesn't accept paths. The source is --from-server.

Source Connection

OptionDescription
--from-serverSource server URL
--from-api-keySource API key
--from-client-timeoutSource timeout
--from-skip-verify-sslSkip source SSL check

Source Filtering

OptionDescription
--from-date-rangeDate range filter
--from-albumsFilter by album (repeatable)
--from-tagsFilter by tag
--from-peopleFilter by person
--from-archivedInclude archived
--from-favoriteInclude favorites only
--from-trashInclude trashed
--from-no-albumAssets not in albums
--from-minimal-ratingMinimum rating (1-5)
--from-partnersInclude partner's assets
--from-makeFilter by camera make
--from-modelFilter by camera model
--from-countryFilter by country
--from-stateFilter by state
--from-cityFilter by city

Example

bash
immich-go upload --from-immich \
  --from-server=http://old:2283 --from-api-key=old-key \
  --server=http://new:2283 --api-key=new-key


How It Works

immich-go upload follows a robust process to ensure your media is imported correctly:

  1. Discovery: Scans your source (folder, zip, or server) for supported images and videos.
  2. Puzzle Solving: Especially for Google Takeouts, it uses intelligent matching to pair media files with their correct JSON metadata, even when filenames have been altered by Google.
  3. Deduplication: Calculates a checksum for each local file and compares it against an index of assets already on your Immich server. Identical files are skipped.
  4. Grouping: Identifies bursts and RAW+JPEG pairs for stacking.
  5. Metadata Acquisition: Collects metadata from sidecar files (JSON, XMP), embedded EXIF data, or as a last resort, the filename.
  6. Immich Integration:
    • Pause Jobs: Can pause background processing (thumbnailing, etc.) to maximize upload speed.
    • Album/Tag Creation: Automatically creates any missing albums or tags on the server.
    • Concurrent Upload: Transfers files in parallel.
    • Post-Upload Stacking: Sends commands to Immich to link related photos (bursts/pairs).

Specialized Modes

Picasa Mode (--picasa)

Optimized for folders managed by Google's legacy Picasa software. It automatically parses .picasa.ini files to associate photos with their original Picasa albums.

iCloud Mode (--icloud)

Tailored for Apple iCloud Photos Takeouts. It uses a two-pass process: first scanning .csv files for metadata and album info, then processing media files with corrected dates and associations.

Banned Files

By default, these patterns are excluded:

  • .DS_Store, /._* - macOS system files
  • .Spotlight-V100/ - Spotlight index
  • @eaDir/, @__thumb/ - Synology thumbnails
  • SYNOFILE_THUMB_*.* - Synology thumbs
  • thumbnails/ - Generic thumbnails
  • Lightroom Catalog/ - Lightroom data
  • .photostructure/ - PhotoStructure data
  • Recently Deleted/ - Trash folders

Add more with --ban-file:

bash
immich-go upload --ban-file="*.tmp" --ban-file="cache/" ...

Patterns ending with / match directories.


JSON Output

With --output=json, output is JSON Lines (JSONL) to stdout, logs to stderr.

Progress

json
{
  "type": "progress",
  "timestamp": "2024-01-15T10:30:00Z",
  "immich_read_pct": 45,
  "assets_found": 234,
  "upload_errors": 0,
  "uploaded": 180
}

Summary

json
{
  "type": "summary",
  "status": "success",
  "exit_code": 0,
  "counters": {
    "total": 300,
    "duplicates": 50,
    "uploaded": 225,
    "errors": 2
  },
  "duration_seconds": 120.5
}

Shell Integration

bash
# Save to file
immich-go upload --output=json ... > upload.jsonl

# Process with jq
immich-go upload --output=json ... | jq 'select(.type == "summary")'

# Separate logs from data
immich-go upload --output=json ... > data.jsonl 2> errors.log