Skip to content

About

Experimental Rust rewrite combining ipatool and UnfairPlay workflows; preview binaries for Apple Silicon macOS, Linux, and Windows.

Topics

Resources

Stars

12 stars

Watchers

0 watching

Forks

Repository files navigation

ipatool-rs

A native dark desktop and CLI for App Store search, account access, IPA / PKG downloads, and guided FairPlay workflows in Rust.

Release License: MIT Platforms

Built on the work of ipatool, UnfairPlay, and their contributors. The combined Go project ipatool-fairplay is the direct reference for this port. Thank you to the original authors and maintainers.

Experimental Rust rewrite. This project was created to use otherwise-unused Codex quota and explore whether Codex could carry a substantial port through implementation, testing, and release. For practical use, prefer the original projects. Full parity remains under validation; see known limitations.

Install · Quick start · Commands · Desktop app · Architecture · MCP · Development · Documentation

Features

Area Capabilities
Public catalog Search applications, look up details, and find the latest external version ID without signing in.
Desktop app Native dark GPUI desktop for public browsing, account interaction, Library, download tasks, and primary FairPlay workflows. Controlled Apple Silicon download, FairPlay setup and automatic reuse passed; other live gates remain.
Account and Store Sign in, inspect or revoke saved credentials, obtain free-app licenses, and query purchases and version metadata.
Packages Download entitled IPA or Mac PKG packages, with package metadata and SINF handling.
MCP Expose six App Store tools to compatible clients over standard input and output.
FairPlay Diagnostics, collection, recovery, and model-based decryption command paths. Controlled macOS setup and two real multi-image IPAs matched pinned UnfairPlay; broader private-data parity remains open.

Platforms

The following release targets are available:

Operating system Architecture Distribution Current scope
macOS Apple Silicon / arm64 Homebrew formula (CLI), cask (GUI), .tar.gz / .zip Developer ID signed and notarized CLI and desktop; controlled account, download and FairPlay setup/reuse checked.
Linux x86_64 .tar.gz Experimental; native CI and public catalog checks pass. Real account and package flows remain unverified.
Windows x86_64 .zip Experimental; native CI and public catalog checks pass. Real account and package flows remain unverified.

macOS x86_64, Linux ARM64, Windows ARM64, and iOS runtime releases are deferred. The platforms accepted by --platform select an App Store offer; they do not expand the host operating systems supported by this release.

Install

Desktop on Apple Silicon macOS

brew tap everettjf/tap
brew install --cask everettjf/tap/ipatool-rs-gui

Open IPATOOL-RS from Applications. Requires macOS 12 or later; protected FairPlay preparation requires macOS 13 or later and explicit administrator approval. Browse first, sign in when downloading, then follow FairPlay → First-time preparation once for a matching installed app and sample IPA. Later matching IPA downloads automatically reuse the saved model. Models and original downloads stay local. Remove collection access in the app before uninstalling it.

For upgrades, use brew upgrade --cask everettjf/tap/ipatool-rs-gui. The CLI and desktop are installed separately; you can use either or both.

CLI on Apple Silicon macOS

brew tap everettjf/tap
brew install everettjf/tap/ipatool-rs
ipatool-rs --version

For an existing installation, use brew upgrade everettjf/tap/ipatool-rs.

Release archives

Download the matching archive and its companion .sha256 file from GitHub Releases:

Platform Archive
macOS arm64 desktop Latest release — choose *-gui-macos-arm64.zip, then move IPATOOL-RS.app to Applications
macOS arm64 CLI Latest release — choose *-macos-arm64.tar.gz
Linux x86_64 Latest release — choose *-linux-x86_64.tar.gz
Windows x86_64 Latest release — choose *-windows-x86_64.zip

For CLI archives, verify the checksum, extract the archive, and put the directory containing ipatool-rs on your PATH. On Windows, the executable is ipatool-rs.exe. The installed command is ipatool-rs and can coexist with the original ipatool.

Checksum verification

Run the check from the directory containing both the archive and its checksum file. Keep only the release you want to verify in that directory; the wildcards below match its downloaded filenames.

macOS:

shasum -a 256 -c ipatool-rs-*-macos-arm64.tar.gz.sha256

For the macOS desktop ZIP:

shasum -a 256 -c ipatool-rs-*-gui-macos-arm64.zip.sha256

Linux:

sha256sum -c ipatool-rs-*-linux-x86_64.tar.gz.sha256

Windows PowerShell: compare the resulting hash with the companion .sha256 file.

Get-FileHash .\ipatool-rs-*-windows-x86_64.zip -Algorithm SHA256

Quick start

All usage examples assume that the installed ipatool-rs command is on your PATH.

Search without an account

ipatool-rs search ScriptWidget --platform macos --country US --limit 5
ipatool-rs lookup --app-id 1555600758 --platform macos --country US
ipatool-rs latest-version-id --app-id 1555600758 --platform macos --country US

Public queries default to the US storefront. Use --country to select another storefront and --format json for machine-readable output. Catalog requests support iPhone, iPad, Apple TV, Apple Watch, macOS, and visionOS offers.

Sign in and download an owned application

ipatool-rs auth login
ipatool-rs auth info
ipatool-rs list-purchases --platform macos --max-results 2
ipatool-rs download --app-id 1555600758 --platform macos --output ./ScriptWidget.pkg

Enter the Apple ID password and any verification code at the interactive prompts. purchase obtains a license for a free application; download requires the appropriate account entitlement.

Native Mac applications such as ScriptWidget download as PKGs. A compatible iPhone or iPad application offered on Apple Silicon Mac can return an IPA instead. Use --platform iphone to request an iPhone offer when the account is entitled to it. Package format follows the selected Store offer.

The desktop FairPlay page starts with a one-time preparation guide: prepare this Mac, choose an installed app and matching sample IPA, then review and start. It collects the supported authorization data, creates a model, processes the sample, and saves the model privately only after processing and applicable page hash checks pass. Advanced options also allow importing an existing model with a matching sample.

On macOS 13 or later, first-time preparation can use a separate, narrowly scoped authorization helper. The GUI stays unprivileged. Protected access requires a Developer ID signed, notarized bundle and explicit administrator approval in System Settings; opening the page never registers the helper. Local ad hoc builds disable this access. The helper reads only two fixed App Store authorization databases, not arbitrary paths, passwords or IPA files. Signed live registration, collection and real recovery passed on the controlled Apple Silicon host; see the authorization design.

After preparation, new IPA downloads automatically queue a separate decryption task and match saved models using the IPA's authorization. You can turn this off or use Decrypt IPA... for an existing download. No model selection is needed for each app. Missing or mismatched models preserve the original download and offer preparation; existing output files are never replaced. PKGs are unaffected. Models are enrollment-specific; the same Apple ID does not guarantee a match. Encrypted executables, extensions and frameworks resolve their own adjacent or manifest-declared authorization. Missing or ambiguous relationships stop processing; unused SINF resources do not select a model for an unrelated image. Managed model storage currently requires macOS/Linux private-file permissions; Windows support and portable private-processing validation remain open. These checks require complete pre-encryption page-hash coverage to report verified plaintext. Older executables without these tables remain explicitly unverified; a present malformed or mismatching table rejects output. Embedded hashes do not establish Apple CMS signature trust. Reports use ipatool-fairplay-decryption-v2; older model receipts retain their original structural-check assurance. See the FairPlay guide for prerequisites and limitations.

Commands

Task Commands
Search and inspect public catalog entries search, lookup, latest-version-id
Manage saved account credentials auth login, auth info, auth revoke
Obtain a free-app license purchase
Query purchases and versions list-purchases, list-versions, get-version-metadata
Download an application package download
Start the MCP server mcp
Inspect and process FairPlay data fairplay-doctor, fairplay-enroll, fairplay-decrypt
Generate shell completions completion

Use ipatool-rs --help or a command's --help for its available options.

Architecture

ipatool-rs architecture: desktop, CLI and MCP share Rust workflows backed by platform services, Apple endpoints and selected guest execution.

The CLI, MCP server, and optional GPUI desktop share Rust application modules. Public catalog queries use the catalog client directly and do not need a saved account or Apple guest execution.

Selected Store and SAP signing paths load pinned Apple framework images and execute ARM64 guest code through Unicorn. Rust supplies the image loaders, execution control, and host-call models. The program does not launch a separate Go, Python, or Swift executable; it still depends on the corresponding Apple guest code and the Unicorn runtime for these paths.

FairPlay setup defaults to native current-format SIDB recovery ported from pinned UnfairPlay. It verifies captured signed keyfiles, authenticates one selected enrollment route, and processes a matching sample IPA before saving a model. fairplay-enroll recover --engine legacy retains exact-build fairplayd/startup-profile research explicitly; there is no automatic legacy retry. SUPF variants 3/5 and signed SUPP variants 1/4 use deterministic class selection, consistent paired tables and available legacy code-signature bindings; conflicting tables never trigger a fallback. Controlled macOS authorization, model recovery and real multi-image decryption passed, including automatic reuse after restart; broader enrollment and portable private-data parity remain open. See real acceptance evidence.

The editable diagram is available as SVG. Implementation and parity evidence are recorded in PORTING.md.

Desktop app (GPUI)

Native dark desktop: public iOS search, region selection and application details.

Actual public-catalog capture; no account credentials or private packages are shown.

Install the signed and notarized Apple Silicon app with the Homebrew cask, or build the optional desktop from source:

cargo run --locked --features gui --bin ipatool-gui

The desktop is titled 🦀IPATOOL-RS 🦀 and uses a macOS-inspired graphite dark palette: neutral gray surfaces, a brighter sidebar and dialogs, gray selections, and blue primary actions and focus rings. It has a full-height workspace. Account, settings and sidebar controls sit at the bottom of the aligned navigation. The account control shows only signed-in status and the account region, including its tooltip. Narrow or collapsed windows use a compact icon rail. It supports public search, lookup by App ID or bundle identifier, six download targets, and a region dropdown searchable by English name or two-letter code. Every launch starts Explore and Library with iOS (iPhone), including when an older preference saved another platform. Other targets remain selectable during the session. Submit the search field with Enter or Search. Subsequent platform or region changes refresh results automatically and clear the previous selection while loading. Select a result to inspect metadata or copy identifiers, JSON, and CLI commands. Queries run in the background and report loading, empty, and error states.

Version 0.3.1 refreshes public support links, the contact email and project copyright to AtomSprout. Platform and live-validation limitations below remain applicable.

Version 0.3.0 adds a signed, notarized Apple Silicon desktop ZIP and Homebrew cask alongside the existing CLI distributions. This is an experimental release, with real controlled macOS account, download and FairPlay setup/reuse acceptance. The Windows GNU x86_64 GUI cross-build links successfully on macOS. Native CI also passes GUI builds, controller fixtures and Clippy on Linux x86_64 and Windows MSVC x86_64. Interactive Linux/Windows desktop and account checks remain open; CLI release status is unchanged. GPUI requires a graphical desktop and graphics support; macOS builds need Xcode with the Metal compiler tools. See the pinned GPUI crate for platform dependencies.

The desktop also exposes login/verification and file-store unlock, purchase history, version selection, background downloads, and FairPlay inspection/collection/recovery/model decryption through shared Rust application workflows. Browsing does not open credential storage. Account access starts only through an explicit account/download action; downloads check the account's storefront and entitlement. The download dialog allows changing the target platform and explains when the browsing region differs from the account region. Signing in or loading a saved account defaults browsing to that account's region, including when its identity or storefront changes. You can still select another region; the catalog and download sheet then warn that some applications may be unavailable to download. The catalog offers a return-to-account-region action. Same-account reauthentication preserves a manual browsing override. Browsing another region does not change the Apple account's storefront. A catalog miss during download preflight reports the account region before any package transfer starts. Task history contains request metadata and artifact paths, without credentials or signed download URLs. Interrupted tasks require explicit review and retry. See current evidence and remaining gates.

For a locally signed Apple Silicon application bundle, use scripts/build-gui-macos.sh (or --debug). The generated .app is ad hoc signed, not notarized or published by default. An explicitly Developer ID signed preview has passed notarization and controlled macOS account/FairPlay acceptance. Public desktop packages use Developer ID signing and stapled notarization tickets; the remaining account/platform gates stay open. Building without --features gui keeps the CLI-only build; plain cargo run still selects ipatool.

Native screenshots include public browsing and separately labeled synthetic account/task walkthroughs. The optional fixture preview supports repeatable interaction testing without an Apple account; its simulated results are not live validation.

Credentials and local state

Host Default credential store
macOS Apple Keychain; interactive commands may request authorization.
Linux Secret Service when available, with encrypted file storage as a fallback.
Windows Encrypted file storage.

Use --file-keychain to select encrypted file storage explicitly:

ipatool-rs --file-keychain auth login

The file store prompts for a separate passphrase. IPATOOL_STATE_DIR can select an absolute private directory for isolated account state and cookies. Keep credentials, cookies, downloaded packages, and private captures outside the repository.

--non-interactive disables terminal prompts and Keychain authorization dialogs. A command that needs approval or missing credentials returns an error so an unattended client can handle it.

MCP

Start the stdio server with:

ipatool-rs mcp --non-interactive

A typical client configuration is:

{
  "mcpServers": {
    "ipatool-rs": {
      "command": "ipatool-rs",
      "args": ["mcp", "--non-interactive"]
    }
  }
}

Use an absolute executable path if the client does not inherit your shell's PATH.

Available tools: search_apps, list_purchases, list_app_versions, get_version_metadata, purchase_app, and download_app. Public search does not require an account; authenticated tools use saved account state.

Encrypted file storage with MCP

MCP uses standard input for its protocol, so it cannot prompt for the file-store passphrase. Supply --keychain-passphrase-file /absolute/private/path with the MCP command. On macOS and Linux, restrict the file to its owner with mode 0600. Remove the file after use and keep both Apple ID passwords and file-store passphrases out of process arguments and client configuration files.

Known limitations

  • Linux and Windows real-account login, credential-store migration, and package workflows have not been validated end to end.
  • macOS still needs a real 2FA challenge, successful expired-token recovery, and complete interactive default-Keychain login and revoke checks. Some authenticated MCP paths also remain unverified.
  • Current-format FairPlay setup and two real IPAs passed on the controlled Apple Silicon host. Matching authorization is required; arbitrary enrollment formats, portable private flows and legacy private-data parity remain unverified.
  • Automatic generation of a new FairPlay startup profile during collection is not implemented in the release.

See TODO.md for actionable remaining work and PORTING.md for the evidence behind each status. The release version does not imply full parity with the reference projects.

Development

Use the stable Rust toolchain with rustfmt and clippy. Run the repository checks before submitting Rust changes:

cargo fmt --check
cargo test --all-targets --quiet
cargo clippy --all-targets -- -D warnings

Some checks require cached Apple framework images or explicitly supplied private data. See the porting record for their prerequisites.

Build for Apple Silicon macOS

scripts/build-macos.sh --arm64

The script writes an ad hoc signed target/release/ipatool-macos-arm64. To install a local development build under the usual command name:

mkdir -p "$HOME/.local/bin"
install -m 755 target/release/ipatool-macos-arm64 "$HOME/.local/bin/ipatool-rs"
export PATH="$HOME/.local/bin:$PATH"
ipatool-rs --version

Add the PATH setting to your shell configuration if needed. This development signature is ad hoc; signed and notarized release packaging follows RELEASING.md.

Native Linux and Windows builds

cargo build --release --locked

Cargo's internal binary name is ipatool (ipatool.exe on Windows). Release packaging installs it as ipatool-rs (ipatool-rs.exe). Use the installed name for the usage examples above.

Documentation

Document Contents
PORTING.md Reference parity, implementation notes, and verification evidence.
TODO.md Remaining validation and implementation work.
RELEASING.md Packaging, signing, notarization, CI releases, and Homebrew updates.
STARTUP_PROFILE_EXPORT.md Design for the unfinished startup-profile export feature.

Project website · Releases · Issues

License and attribution

The project is distributed under the MIT License, matching ipatool and UnfairPlay. The adapted DarkPhoenix recovery component retains its Apache-2.0 license and attribution; see NOTICE and LICENSE-DARKPHOENIX.txt.

About

Experimental Rust rewrite combining ipatool and UnfairPlay workflows; preview binaries for Apple Silicon macOS, Linux, and Windows.

Topics

Resources

Stars

12 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages