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))
Metadata
Release files for developer-disk-image 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| developer_disk_image-0.3.0.tar.gz | 14.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| developer_disk_image-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.9 kB
Release files / developer_disk_image-0.3.0.tar.gz
| Download URL | developer_disk_image-0.3.0.tar.gz |
|---|---|
| Size | 14.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1fb9841dcc5cf81e697b6e0a9c14909c059c1893d675b38398a91c08cb7ba8bc
|
|
BLAKE2b-256 checksum How to use checksums |
52f516c742e98191761d0925ed424468e3bec14503644c84851046602667d3c3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.
Transparency logRelease files / developer_disk_image-0.3.0-py3-none-any.whl
| Download URL | developer_disk_image-0.3.0-py3-none-any.whl |
|---|---|
| Size | 6.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5451eb280bcf5188f406107081b05cb4718f645f5dd9c64ee942f577a43108f9
|
|
BLAKE2b-256 checksum How to use checksums |
c9478322b1356a4e3e455a743308d1d43d117b1e82e8311639e710171e950b8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 7, 2026.
Transparency log