Release and installer commands
release.sh, the signed MANIFEST, and the verbs of mapple-install.
release.sh
A release is a checkout of the release repository with its files in assets/ (gh release download <tag> -D assets, or by hand), its
MANIFEST, MANIFEST.sig and allowed_signers. release.sh puts Open Mapple together on your Mac from them and your iOS.
./release.sh [--ipsw IPSW] [--touch-fw FW]
- It checks
MANIFEST.sigagainstallowed_signers(ssh-keygen -Y verify, identityopen-mapple-release, namespacemapple-release) and every file ofassets/against the size and SHA-256MANIFESTlists, and stops on any difference. - Without
--ipswit downloads iOS 16.7.16 (20H392) for the iPhone X from Apple’s servers (6.2 GB intowork/): running it is your consent. With--ipswit uses your copy. Either way the IPSW’s size and SHA-256 are checked. --touch-fw(developers) putsFW_NF_ILI7807S_*.bininto the payload too; normally the loader takes the copy the zip leaves in the tail area.- Building the root needs
sudo: the script prints the command and stops; run it, then run the script again. Out comeout/root.img(for fastboot) andout/mapple-...-PERSONAL.zip(for the recovery).
Maintainers only:
| Command | What |
|---|---|
./release.sh pack OUT TOP TAG [--rehearsal] | assets/, assets/SHA256SUMS and MANIFEST for the tag, from an mka build of the single product in OUT and the tree TOP; every project must be clean and at its origin/main (--rehearsal: any commit, the tag marked as such). The kernel in OUT must be the common tree’s HEAD |
./release.sh sign KEY | MANIFEST.sig with the release key (ssh-keygen -Y sign, namespace mapple-release); writes allowed_signers.new when the key’s line is new |
MANIFEST holds: the release tag; the IPSW’s size and SHA-256; the command line; adt, payload_max and root_size; the kernel’s
version; one source <project> <commit> line per project; and one file <sha256> <size> <name> line per asset: kernel, shim.Image,
mtkloader.bin, mapple-install, root-overlay.tar and tools.tar.
mapple-install
What the zip runs in the recovery (static aarch64), and what mka uses on the Mac to make the boot image. DEV is the partition
that holds the root (userdata in the single layout); every write is read back and hashed.
| Verb | What |
|---|---|
verify-root RANGES DEV | both volume headers and the SHA-256 of every allocated block against root.ranges |
put DEV REGION|OFFSET FILE | FILE into a region of the tail (settings, firmware, log; zero-filled to its end) or at a byte offset |
save DEV NAME FILE | FILE kept in the saved area under NAME (boot), its header updated; chained records only the size and SHA-256 of the boot image as chained |
ilifw FIRMWARE OUT | the touch firmware as the loader’s ilifw item |
chain BOOT LOADER PAYLOAD [--backup FILE] [--out FILE] | the loader in front of the Android kernel in BOOT and the payload after it, written to --out or back to BOOT; --backup keeps BOOT as it was if it carries no loader yet; a kernel that already carries a loader is chained again from the Android kernel inside it |
split-carve DISK [--size GIB] [--check] | with the dual boot built in: xnusys (default 22 GiB) carved off the end of userdata; the boot partition is not touched |
split-chain DISK BOOT LOADER PAYLOAD | after the root is flashed and checked: the boot image kept in xnusys’s saved area, then chained, and the chained image recorded |
split-uninstall DISK BOOT [--check] | the boot image back from the saved area (only while it is still the one chained), the partition table as before the carve |
The zip’s script (update-binary) checks the phone, the root and every block before it writes anything: it clears the settings record,
writes the phone’s own firmware into the tail area, keeps the Android boot in the saved area, and chains the loader into boot last,
recording the chained image’s size and SHA-256 after it. A split zip has two passes (without xnusys it carves it and stops for
fastboot flash xnusys root.img; with it, it chains); an uninstall zip gives xnusys back to userdata and the saved boot back to boot.
Source: release.sh of mapple_releases (branch spaced) at a8ff522; installer/mapple-install.c and installer/update-binary of
mapple_build at f7431bb; installer/split.c of mapple_splitboot at 406b03a.
Applies to realme 8i (spaced), release 1 · Updated 15 November 2026