Skip to main content

Pypi version

Overview

Store both types of Apple's DeveloperDiskImage files:

  • DeveloperDiskImage.dmg & DeveloperDiskImage.dmg.signature
    • Used for each iOS version < 17.0
  • The new Personalized images, but splitted to:
    • APFS
    • BuildManifest.plist
    • Trustcache
  • The Cryptex1 assets, for installing the same DDI through cryptexd instead of the image mounter:
    • APFS
    • BuildManifest.plist
    • Trustcache
    • Cryptex info plist
    • Volume root hash

The split of the new format is requires for OS* other than macOS that will have trouble extracting the original APFS image inside: ~/Library/Developer/DeveloperDiskImages.

Layout

Directory Consumed by
DeveloperDiskImages/<version>/ iOS < 17.0
PersonalizedImages/Xcode_iOS_DDI_Personalized/ the image mounter (mounter auto-mount)
PersonalizedImages/Xcode_iOS_DDI_Cryptex/ cryptexd (cryptex auto-install)

Every payload is published under a fixed file name, so download URLs stay predictable across releases:

File Personalized Cryptex
BuildManifest.plist yes yes
Image.dmg PersonalizedDMG Cryptex1,GenericDmg
Image.dmg.trustcache LoadableTrustCache Cryptex1,GenericTrustCache
Image.dmg.cryptex_info -- Cryptex1,CryptexInfoPlist
Image.dmg.root_hash -- Cryptex1,GenericVolume

Apple's own paths embed a build number (022-22107-072.dmg), so the published BuildManifest.plist is rewritten to declare the fixed names instead. Only Info.Path is adjusted -- the digests personalization depends on are untouched -- which keeps a downloaded cryptex directory usable as a drop-in Restore directory.

Updating

update_ddi.py refreshes every variant from a local Xcode installation. macOS only, no dependencies, run it with uv:

uv run --script update_ddi.py             # refresh every variant of the iOS DDI
uv run --script update_ddi.py --dry-run   # report what would change, write nothing
uv run --script update_ddi.py --platform tvOS --variant cryptex

Pass --script so uv runs it as a standalone script rather than treating this repository as a uv project (which would leave a stray uv.lock and .venv behind).

It reads Xcode's bundle from /Library/Developer (falling back to attaching CoreDevice/CandidateDDIs/<platform>_DDI.dmg when no expanded copy exists), verifies every payload against the SHA-384 digests in the build manifest before publishing it, and removes stale files left over from a previous build. Remember to bump LATEST_DDI_BUILD_ID in pymobiledevice3 to match whatever build it reports.

Python package

Additionally, this repo provides a python API for accessing this repository. You can install it as follows:

python3 -m pip install -U developer_disk_image

Example usage

Payloads are fetched from raw.githubusercontent.com, which is not subject to the REST API's 60-requests-per-hour anonymous quota, so no GitHub token is needed. create() accepts a ref (branch, tag or commit) to read a revision other than main.

from developer_disk_image.repo import DeveloperDiskImageRepository

repo = DeveloperDiskImageRepository.create()

# will get both the APFS and the signature file
developer_disk_image = repo.get_developer_disk_image('16.4')

# will get all necessary files for mount
personalized_disk_image = repo.get_personalized_disk_image()

# will get all necessary files for installing the DDI as a cryptex
cryptex_disk_image = repo.get_cryptex_disk_image()

Writing the cryptex assets back out under their published names produces a directory that cryptexd clients accept as-is:

from pathlib import Path

from developer_disk_image.repo import CRYPTEX_IMAGE_PAYLOADS

restore = Path('Xcode_iOS_DDI_Cryptex')
restore.mkdir(parents=True, exist_ok=True)
(restore / 'BuildManifest.plist').write_bytes(cryptex_disk_image.build_manifest)
for field, name in CRYPTEX_IMAGE_PAYLOADS.items():
    (restore / name).write_bytes(getattr(cryptex_disk_image, field))

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

developer_disk_image-0.3.0.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

developer_disk_image-0.3.0-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file developer_disk_image-0.3.0.tar.gz.

File metadata

  • Download URL: developer_disk_image-0.3.0.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for developer_disk_image-0.3.0.tar.gz
Algorithm Hash digest
SHA256 1fb9841dcc5cf81e697b6e0a9c14909c059c1893d675b38398a91c08cb7ba8bc
MD5 754dc954a3fcd10132720d615b4f4a2d
BLAKE2b-256 52f516c742e98191761d0925ed424468e3bec14503644c84851046602667d3c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for developer_disk_image-0.3.0.tar.gz:

Publisher: python-publish.yml on doronz88/DeveloperDiskImage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file developer_disk_image-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for developer_disk_image-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5451eb280bcf5188f406107081b05cb4718f645f5dd9c64ee942f577a43108f9
MD5 ae68adccb057fd1182affad003e8e47f
BLAKE2b-256 c9478322b1356a4e3e455a743308d1d43d117b1e82e8311639e710171e950b8f

See more details on using hashes here.

Provenance

The following attestation bundles were made for developer_disk_image-0.3.0-py3-none-any.whl:

Publisher: python-publish.yml on doronz88/DeveloperDiskImage

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page