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.
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.
- Python 3.14+ and uv
- A RapidAPI key subscribed to the free tier of the Store Apps API (100 requests/month)
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.csvThis 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.
| 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) |
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/UbuntuUse 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.csvThat 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.
ideviceinstallerruns on macOS, Linux and Windows.
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<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,0Apps 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.
uv run ruff check . # lint
uv run ruff format . # format
uv run pytest --cov # tests + coverageMIT — see LICENSE.