id = "immich-cli"
name = "Immich CLI"
homepage = "https://immich.app/"
description = "A command-line interface for Immich."
executables = ["immich"]
[dotfiles]
paths = []
exclude = []
secret = ["[configHome]/immich/auth.yml"]
side_effect = false
[commands]
format = 1
label = "Immich CLI"
description = "Upload photos and videos to an Immich server. Login, logout, server-info and the delete-after-upload flags are outside this form."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false }
[[commands.subcommand]]
path = ["upload"]
label = "Upload assets"
description = "Upload files or directories to the logged-in Immich server."
[[commands.subcommand.source]]
id = "help"
kind = "manual"
url = "https://immich.app/docs/features/command-line-interface"
revision = "2026-10-27"
evidence = """
Usage: immich upload [paths...] [options]
Arguments:
paths One or more paths to assets to be uploaded
Options:
-r, --recursive Recursive (default: false, env: IMMICH_RECURSIVE)
-i, --ignore <pattern> Pattern to ignore (env: IMMICH_IGNORE_PATHS)
-h, --skip-hash Don't hash files before upload (default: false, env: IMMICH_SKIP_HASH)
-H, --include-hidden Include hidden folders (default: false, env: IMMICH_INCLUDE_HIDDEN)
-a, --album Automatically create albums based on folder name (default: false, env: IMMICH_AUTO_CREATE_ALBUM)
-A, --album-name <name> Add all assets to specified album (env: IMMICH_ALBUM_NAME)
-n, --dry-run Don't perform any actions, just show what will be done (default: false, env: IMMICH_DRY_RUN)
-c, --concurrency <number> Number of assets to upload at the same time (default: 4, env: IMMICH_UPLOAD_CONCURRENCY)
-j, --json-output Output detailed information in json format (default: false, env: IMMICH_JSON_OUTPUT)
"""
[[commands.subcommand.field]]
id = "paths"
label = "Files or directories"
type = "path"
path = { kind = "any", role = "input" }
position = 0
multiple = true
min = 1
sources = ["help"]
[[commands.subcommand.field]]
id = "recursive"
label = "Include subfolders"
type = "boolean"
option = ["--recursive", "-r"]
sources = ["help"]
[[commands.subcommand.field]]
id = "dry_run"
label = "Dry run"
description = "Show what would happen without uploading."
type = "boolean"
option = ["--dry-run", "-n"]
sources = ["help"]
[[commands.subcommand.field]]
id = "album"
label = "Create albums from folder names"
type = "boolean"
option = ["--album", "-a"]
sources = ["help"]
[[commands.subcommand.field]]
id = "album_name"
label = "Album name"
type = "string"
option = ["--album-name", "-A"]
sources = ["help"]
[[commands.subcommand.field]]
id = "ignore"
label = "Ignore pattern"
type = "string"
option = ["--ignore", "-i"]
sources = ["help"]
[[commands.subcommand.field]]
id = "skip_hash"
label = "Skip hashing"
type = "boolean"
option = ["--skip-hash"]
sources = ["help"]
[[commands.subcommand.field]]
id = "include_hidden"
label = "Include hidden folders"
type = "boolean"
option = ["--include-hidden", "-H"]
sources = ["help"]
[[commands.subcommand.field]]
id = "concurrency"
label = "Concurrent uploads"
type = "integer"
option = ["--concurrency", "-c"]
sources = ["help"]
[[commands.subcommand.field]]
id = "json_output"
label = "JSON output"
type = "boolean"
option = ["--json-output", "-j"]
sources = ["help"]
[[commands.subcommand.task]]
id = "upload_dir"
label = "Upload a folder"
fields = ["paths", "recursive"]
required = ["paths"]
set = { recursive = [true] }
[[commands.subcommand.task]]
id = "preview"
label = "Preview an upload"
fields = ["paths", "recursive", "dry_run"]
required = ["paths"]
set = { recursive = [true], dry_run = [true] }
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["paths", "recursive", "dry_run", "album", "album_name"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["ignore", "skip_hash", "include_hidden", "concurrency", "json_output"]