Skip to content

Toshik1978/apple-to-google

Repository files navigation

CI Tests Coverage

Apple → Google app finder

A command-line tool that finds Android (Google Play) analogues for your Apple App Store apps.

Give it a CSV exported from Apple (with a CFBundleIdentifier column). For each app it looks up the App Store name via Apple's free iTunes Lookup API, finds the matching Google Play app with the Store Apps API, caches every resolved match on disk, and writes a sibling <name>.android.csv with the matched Google Play app id, name, URL and price.

Why I built this

I was on Apple for 10 years, and over that time I'd accumulated a whole set of apps I relied on day to day. When I started thinking about moving to Android, the real question wasn't the phone — it was whether I'd be able to replace all of those apps. I couldn't find a good enough way to check: going through them one by one, searching Google Play by hand, was slow and error-prone.

So I wrote this. I exported my Apple apps, ran them through the tool, and got back a CSV of the Google Play equivalents in one pass. It saved a lot of time — but more importantly, it's what actually made the decision for me. Once I could see that every app had an Android counterpart except one, I knew the migration was safe, and I went ahead with it.

Requirements

Usage

git clone https://github.com/Toshik1978/apple-to-google
cd apple-to-google

cp .env.dist .env        # put your key in RAPID_API_KEY (or pass --key)
uv run apple-to-google apps.csv

This reads apps.csv and writes apps.android.csv beside it. Apple name lookups are free; each matched app costs one Store Apps request, and results are cached under --cache so re-runs are free.

Options

Option Description
--key RapidAPI key (overrides RAPID_API_KEY from env/.env)
--cache DIR Cache directory (default .cache)
--region CC App Store / Google Play region code (default us)
--lang LL Google Play language code (default en)
-v Verbose logging
FILENAME Input CSV with a CFBundleIdentifier column (required)

Generating the input from your iPhone

You don't have to build the CSV by hand — you can read the list of installed apps straight off your iPhone with ideviceinstaller (part of libimobiledevice).

Install it, then plug the iPhone in over USB, unlock it, and tap "Trust This Computer":

brew install ideviceinstaller        # macOS
sudo apt install ideviceinstaller    # Debian/Ubuntu

Use a recent build (1.2.0+, Oct 2025) — earlier versions predate current iOS support.

ideviceinstaller list prints your installed user apps (not your whole purchase history), and its --xml output includes each app's CFBundleIdentifier. Turn that into an apps.csv this tool can read (only stdlib plistlib/csv, no extra packages):

ideviceinstaller list --xml | python3 -c '
import sys, csv, plistlib
apps = plistlib.load(sys.stdin.buffer)
w = csv.writer(sys.stdout)
w.writerow(["CFBundleIdentifier", "CFBundleDisplayName"])
for a in apps:
    w.writerow([a.get("CFBundleIdentifier", ""), a.get("CFBundleDisplayName", "")])
' > apps.csv

That writes a header row plus one line per app. The tool only needs the CFBundleIdentifier column (the CFBundleDisplayName is there so you can eyeball the list); see the format below. Then run apple-to-google apps.csv as usual.

Notes: this lists apps currently installed on the device (the "apps I actually use" set). There is no on-device / iOS-only way to enumerate installed apps with their bundle ids — the USB connection is required. ideviceinstaller runs on macOS, Linux and Windows.

CSV format

Input

A CSV with a header row that includes a CFBundleIdentifier column (the Apple bundle id of each app). If it also has a CFBundleDisplayName (or CFBundleName) column — as an ideviceinstaller export does — that name is used as the Google Play search term directly; otherwise the name is looked up from the App Store. Any further columns are ignored, so an unmodified Apple export works as-is:

CFBundleIdentifier,CFBundleDisplayName
com.spotify.client,Spotify
com.google.chrome.ios,Chrome

Output

<name>.android.csv, written beside the input. It has no header row; each line is one app with these five columns, in order:

# Column Source Example
1 Apple bundle id the input CFBundleIdentifier com.spotify.client
2 Google Play app id Google Play package name com.spotify.music
3 App name Google Play title Spotify: Music and Podcasts
4 Google Play URL store listing link https://play.google.com/store/apps/details?id=com.spotify.music
5 Price numeric price (0 if free) 0
com.spotify.client,com.spotify.music,Spotify: Music and Podcasts,https://play.google.com/store/apps/details?id=com.spotify.music,0

Apps with no App Store entry or no Google Play match are skipped (logged at -v), so a missing analogue never aborts the run — it just won't appear in the output.

Development

uv run ruff check .          # lint
uv run ruff format .         # format
uv run pytest --cov          # tests + coverage

License

MIT — see LICENSE.

About

Find Android (Google Play) equivalents for your Apple App Store apps — a Python CLI that maps an iPhone app list to matched Play Store entries.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages