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
cryptexdinstead 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1fb9841dcc5cf81e697b6e0a9c14909c059c1893d675b38398a91c08cb7ba8bc
|
|
| MD5 |
754dc954a3fcd10132720d615b4f4a2d
|
|
| BLAKE2b-256 |
52f516c742e98191761d0925ed424468e3bec14503644c84851046602667d3c3
|
Provenance
The following attestation bundles were made for developer_disk_image-0.3.0.tar.gz:
Publisher:
python-publish.yml on doronz88/DeveloperDiskImage
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
developer_disk_image-0.3.0.tar.gz -
Subject digest:
1fb9841dcc5cf81e697b6e0a9c14909c059c1893d675b38398a91c08cb7ba8bc - Sigstore transparency entry: 2371938654
- Sigstore integration time:
-
Permalink:
doronz88/DeveloperDiskImage@5423e4e955fbb3a9eef3e1212acfbfc6e7a26236 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/doronz88
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@5423e4e955fbb3a9eef3e1212acfbfc6e7a26236 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file developer_disk_image-0.3.0-py3-none-any.whl.
File metadata
- Download URL: developer_disk_image-0.3.0-py3-none-any.whl
- Upload date:
- Size: 6.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5451eb280bcf5188f406107081b05cb4718f645f5dd9c64ee942f577a43108f9
|
|
| MD5 |
ae68adccb057fd1182affad003e8e47f
|
|
| BLAKE2b-256 |
c9478322b1356a4e3e455a743308d1d43d117b1e82e8311639e710171e950b8f
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
developer_disk_image-0.3.0-py3-none-any.whl -
Subject digest:
5451eb280bcf5188f406107081b05cb4718f645f5dd9c64ee942f577a43108f9 - Sigstore transparency entry: 2371939452
- Sigstore integration time:
-
Permalink:
doronz88/DeveloperDiskImage@5423e4e955fbb3a9eef3e1212acfbfc6e7a26236 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/doronz88
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@5423e4e955fbb3a9eef3e1212acfbfc6e7a26236 -
Trigger Event:
workflow_dispatch
-
Statement type: