OCI-DELTA(1)(oci-delta)

πŸ“¦
version 0.3.1 Β· 2 versions
, in fedora 44

🌸 NAME 🌸

oci-delta β€” bestie, this lil icon makes delta files between OCI image archives, and applies them too πŸ’–

ok so quick vibe check: this is the oci-delta page from the oci-delta manual (section 1). sit down, grab a strawberry πŸ“, we're gonna go through everything.

✨ SYNOPSIS ✨

oci-delta subcommand [OPTIONS] [ARGUMENTS]

oci-delta create [-s|--statistics] [--log-level LEVEL] [--debug] [-q|--quiet] [-j|--jobs N] [--binary-diff METHOD] [--signature FILE] old-image new-image output

oci-delta apply [--ostree-repo PATH] [--directory PATH] [--container-storage PATH] [--verify-key FILE] [--log-level LEVEL] [--debug] [-q|--quiet] delta-file output

oci-delta import [--container-storage PATH] [-t|--tag NAME] [--verify-key FILE] [--log-level LEVEL] [--debug] [-q|--quiet] delta-file

πŸ¦‹ DESCRIPTION πŸ¦‹

okay so oci-delta creates and applies delta files between OCI image archives for bootc systems. and the way that delta files are significantly smaller than full OCI archives?? because they exclude layers that are already present on the target system, and they use binary diffs (tar-diff) for the changed layers. lowkey genius, no cap πŸ”₯

This tool operates on OCI image archives and supports three modes of operation: creating deltas between two images, applying deltas to reconstruct full images, and directly importing deltas into container storage. three modes, three moods, all slaying πŸ’…

Delta files are OCI artifacts, which means they can be stored in registries or distributed via removable media for air-gapped environments. usb stick girlies, this one's for you 🫢


πŸ‘‘ SUBCOMMANDS πŸ‘‘

πŸŽ€ create

Create a delta between two OCI images. main character energy fr fr.

Syntax:

oci-delta create [OPTIONS] old-image new-image output

Arguments:

  • old-image β€” the old/source image. supported formats are oci-archive:/PATH, oci:/PATH, or containers-storage:/REF. if you don't give a type prefix, oci-archive is what it assumes. it's giving default behavior ✨
  • new-image β€” the new/target image (same format as old-image, matching outfits πŸ’–).
  • output β€” the output delta file (oci-archive:PATH or oci:PATH).

Options:

  • -s, --statistics β€” show statistics after delta creation, including layer counts and bytes saved. the receipts, bestie 🧾
  • --log-level=LEVEL β€” log verbosity level: error, warn, info, or debug (default: info).
  • --debug β€” show detailed progress information during delta creation (shorthand for --log-level=debug).
  • -q, --quiet β€” suppress all output except errors (shorthand for --log-level=error). silent mode, mysterious era πŸ’€
  • -j, --jobs=N β€” maximum number of parallel tar-diff workers (default: number of CPUs). multitasking queen.
  • --binary-diff=METHOD β€” per-file binary diff backend: bsdiff (default), zstd, or auto. auto uses zstd under the zstd size cap, then bsdiff under the bsdiff cap. it literally picks for you, iconic.
  • --compression-level=N β€” outer tar-diff zstd level (0 = tar-diff default).
  • --zstd-diff-level=N β€” zstd level for dictionary patches (-1 = use --compression-level / tar-diff default).
  • --zstd-diff-window=N β€” zstd window size in MiB for dictionary patches. 0 (default) sizes the window automatically from the source file. a non-zero value must be a power of two and at most 512. read that again, bestie πŸ“
  • --max-zstd-diff-size=N β€” max file size in MiB for zstd dictionary patches (default: 128; 0 = no extra cap). files over this cap skip zstd. bye πŸ‘‹
  • --max-bsdiff-size=N β€” max file size in MiB for bsdiff (default: 192; 0 = no limit).
  • --signature=FILE β€” signature OCI artifact to embed in the delta. can be specified multiple times to embed multiple signatures. this enables offline signature verification during apply/import. stack those sigs, it's giving security πŸ’œ

🌈 apply

Apply a delta to reconstruct a full OCI image archive. glow-up complete ✨

Syntax:

oci-delta apply [OPTIONS] delta-file output

Arguments:

  • delta-file β€” path to the delta file to apply.
  • output β€” output image (oci-archive:PATH or oci:PATH). if no type prefix is given, oci-archive is used.

Options:

  • --ostree-repo=PATH β€” OSTree repository path for delta source data (default: /ostree/repo). auto-detects the source image ref via config digest. the --ostree-repo is the default on bootc systems. lowkey the hometown hero 🏠
  • --directory=PATH β€” source directory containing layer files for delta reconstruction. alternative to --ostree-repo.
  • --container-storage=PATH β€” podman container storage root for delta reconstruction. alternative to --ostree-repo.
  • --verify-key=FILE β€” path to cosign public key in PEM format for signature verification. if specified, the delta's embedded signature will be verified before applying. trust but verify, periodt πŸ”
  • --log-level=LEVEL β€” log verbosity level: error, warn, info, or debug (default: info).
  • --debug β€” show detailed progress information during delta application (shorthand for --log-level=debug).
  • -q, --quiet β€” suppress all output except errors (shorthand for --log-level=error).
🚨 note: --ostree-repo, --directory, and --container-storage are mutually exclusive. only one source type can be specified. pick ONE, bestie, this is not a choose-multiple situation πŸ™ˆ

πŸ’– import

Apply a delta and import the result directly into container storage. straight into the vault, no detours πŸ’…

Syntax:

oci-delta import [OPTIONS] delta-file

Arguments:

  • delta-file β€” path to the delta file to import.

Options:

  • --container-storage=PATH β€” podman container storage root (default: system default location).
  • -t, --tag=NAME β€” tag name for the imported image (e.g., myimage:latest). name her πŸ’–
  • --verify-key=FILE β€” path to cosign public key in PEM format for signature verification.
  • --log-level=LEVEL β€” log verbosity level: error, warn, info, or debug (default: info).
  • --debug β€” show detailed progress information during import (shorthand for --log-level=debug).
  • -q, --quiet β€” suppress all output except errors (shorthand for --log-level=error).

After a successful import, the image ID is printed to stdout and can be used with podman or other container tools. so you can just grab it and go πŸŽ€


⭐ EXIT STATUS ⭐

  1. 0 β€” Success. the operation completed without errors. we ate and left no crumbs 🍽️
  2. 1 β€” An error occurred. error details are written to stderr. not the vibe, but at least it tells you why 😭

🌸 EXAMPLES 🌸

Create a delta between two OCI archives:

$ oci-delta create old.oci-archive new.oci-archive update.oci-delta

Create a delta with statistics:

$ oci-delta create --statistics old.oci new.oci delta.oci

Delta creation statistics:
  Old image layers: 15
  New image layers: 16
  Processed layers: 8
  Skipped layers:   7
  Processed layer bytes:  125829120
  Tar-diff layer bytes:   8388608
  Original layer bytes:   12582912
  Bytes saved:            104857600 (83.3%)

look at those numbers. 83.3% saved?? that's not a glow-up that's a full transformation πŸ’…

Apply a delta on a bootc system:

$ oci-delta apply update.oci-delta new.oci-archive
$ bootc switch --transport=oci-archive new.oci-archive
$ rm new.oci-archive

Import a delta directly into container storage:

$ oci-delta import --tag myapp:v2.0 update.oci-delta
sha256:abc123...
$ podman images
REPOSITORY    TAG       IMAGE ID      CREATED        SIZE
myapp         v2.0      abc123...     1 minute ago   500 MB

Create delta with embedded signature:

$ oci-delta create --signature signature.oci \
    old.oci new.oci delta.oci

Apply delta with signature verification:

$ oci-delta apply --verify-key cosign.pub \
    signed-delta.oci output.oci

Air-gapped USB workflow:

# On internet-connected system: create delta
$ oci-delta create \
    containers-storage:registry.io/app:v1.0 \
    containers-storage:registry.io/app:v2.0 \
    /mnt/usb/app-update.delta

# Transfer USB drive to air-gapped system

# On air-gapped bootc system: apply and install
$ oci-delta apply /mnt/usb/app-update.delta app-v2.oci
$ bootc switch --transport=oci-archive app-v2.oci
$ reboot

Use container storage as delta source:

$ oci-delta apply --container-storage /var/lib/containers/storage \
    delta.oci output.oci

Use custom directory as delta source:

$ oci-delta apply --directory /path/to/layers \
    delta.oci output.oci

🧚 FILES 🧚

  • /ostree/repo β€” default OSTree repository path for delta source data on bootc systems. layer files from installed images are stored as objects under this directory. her natural habitat 🌳
  • /var/tmp/oci-delta-* β€” temporary working directories created during delta operations. automatically cleaned up on successful completion. she cleans up after herself, we love a tidy queen 🧹
  • /var/lib/containers/storage β€” default podman container storage location (system default).

πŸ’œ REQUIREMENTS πŸ’œ

The target system must run bootc version 1.15.0 or later for proper layer deduplication using diff_ids. no old bootc, bestie, upgrade or perish 🚨


🌈 SEE ALSO 🌈

Project homepage: ⟨https://github.com/containers/oci-delta⟩

Delta file format specification: see README.md in the source repository.


πŸ’… AUTHORS πŸ’…

oci-delta was written by the Containers organization. absolute legends, we stan 🫢

See MAINTAINERS.md in the source repository for the current list of maintainers.


Copyright Β© 2026 the oci-delta authors.

Licensed under the Apache License, Version 2.0.


and that's the whole page, bestie πŸ’– this was version 0.2.0, dated June 2026, from the oci-delta crew β€” go make some tiny deltas, ily, bye βœ¨πŸ¦‹
πŸ“¦ where this page comes from
  • fedora 44: oci-delta 0.3.1-1.fc44 Β· Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND MIT AND MPL-2.0
  • πŸ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms