Breaking Into Apple’s Walled Garden (Almost)
Breaking Into Apple’s Walled Garden (Almost)
I didn’t set out to fight the system, but here we are :|

Introduction
All I wanted was a simple solution to a bigger problem:
Develop and run my own app on my own iPhone without paying Apple a dime.
If you’ve ever tried developing for iOS, you know how locked down the ecosystem is. Unlike Android, where you can just download and install an APK, iOS has always been about control. Apple decides what goes in, and unless you pay $100/year, own a Mac, and follow their endless rules — you’re stuck.
That’s fine if you’re a big company. But for students, indie devs, or hobbyists on Windows/Linux, it feels impossible.
And yet, I found a way.
Not a perfect way. Not a sustainable way. But it just works.
The Early Days of Sideloading
My journey started with something very non-serious and personal: removing ads from YouTube on iOS.
On Android, we have coughs… ReVanced and other mods. On iOS? Things weren’t so easy. I stumbled upon sideloading and thought it meant jailbreaking at first. Turns out — it didn’t.
I grabbed some cracked .ipa files (basically iOS’s version of .apk) but had no idea how to install them. That’s when I entered the chaotic world of sideloading tools:
- Sidestore (didn’t work)
- Sideloadly (no Linux support)
- Sideloader (almost worked)
- Finally AltStore + AltServer-Linux, which brought some magic — with more problems.
AltStore was a revelation, but only when you understood how it worked. Then came Apple’s infamous 3-app limit.
I tried hacking around it: running multiple Docker containers, juggling different Apple IDs, even modding AltStore into “AltStoreX.” After days of painful .plist editing, I got two independent AltStore instances running on one device—only to discover the 3-app limit is tied to the device itself, not the Apple ID. Brutal.
Eventually, I found TrollStore, which exploited a vulnerability (like macdirtycow) to bypass refresh limits entirely. No 7-day expiry. No re-signing. It was glorious.
⚠️ Caveat: TrollStore only works on specific iOS versions/devices.
The Real Problem
Sideloading mods was fun, but the real problem hit me when I started working on my own app:
Sparklines Mobile, a music streaming app built with React Native + Expo (unfinished, and might never be finished).
On Android, Expo’s EAS build system worked flawlessly. I could build an .apk and install it in minutes.
On iOS? A different story:
- Simulator builds only, not real
.ipas - Requires a paid Apple Developer Account
- Requires macOS + Xcode
- Distribution outside the App Store is effectively impossible
As someone on Linux, that was a dead end. But then I thought:
What if I could just get an unsigned .ipa and sideload it manually?
Apple wants that to happen only on macOS.
Challenge accepted.
The Breakthrough
While digging around, I noticed projects like uYouPlus and EeveeSpotify were building .ipa files using GitHub Actions on macOS runners.
That’s when it clicked:
Why not do the same for Expo apps?
I spent hours fighting YAML configs, debugging failed builds, and experimenting with different workflows. Eventually, I got GitHub’s macOS runners to generate an unsigned .ipa, which I then sideloaded using AltStore/TrollStore.
Guess what — it worked.
I had my own React Native app running on my iPhone — no Mac, no paid Apple account, nothing.
Sure, crashes were ugly (probably because I hadn’t set up error boundaries properly in my code), but native modules worked fine. It felt surreal.
The Tool That Never Was
At this point, I considered turning the whole process into a tool. Maybe:
- A CLI that auto-generates the GitHub Actions workflow
- Or a web app where you link your GitHub account and upload code, and it spits out an
.ipa—something like Vercel for mobile apps
PS: Projects like webmuxd could be game-changers here.
Basically, it could be a free alternative to Expo’s paid EAS service — for people who just want to test and learn without Apple’s gatekeeping.
I had some ideas and minimal execution logic… but never turned them into something real. Maybe I didn’t need to. I was already moving away from iOS.
Still, I pushed what I had to GitHub: Altux.
Check out the GitHub Action template and README there for the nitty-gritty details.
If anyone wants to build on top of it, go ahead.
Conclusion
This whole thing started because I just wanted to test an iOS app without paying Apple. In the process, I learned a lot about sideloading, CI, and Apple’s walls.
I’m not maintaining this project, and I’m not sticking with iOS either. But maybe this little experiment will help students, indie devs, or tinkerers who just want to learn without paying $100/year for the privilege.
Sometimes, the best hacks come from scratching your own itch.
This was mine. Waiting for yours.