●TEST — The Rork Companion app lets you test on a real iPhone without a paid Apple Developer account●CLOUD — Code compiles on a cloud Mac, streaming a 60fps live simulator with real touch input●BROWSER — Design, code, and test entirely in Chrome or Safari — no Xcode required●PUBLISH — Two-click App Store publishing keeps the submission process simple●MAX — Rork Max builds native Swift apps for iPhone, iPad, Apple Watch, and Vision Pro●RN — Standard Rork generates iOS and Android apps together with React Native (Expo)●TEST — The Rork Companion app lets you test on a real iPhone without a paid Apple Developer account●CLOUD — Code compiles on a cloud Mac, streaming a 60fps live simulator with real touch input●BROWSER — Design, code, and test entirely in Chrome or Safari — no Xcode required●PUBLISH — Two-click App Store publishing keeps the submission process simple●MAX — Rork Max builds native Swift apps for iPhone, iPad, Apple Watch, and Vision Pro●RN — Standard Rork generates iOS and Android apps together with React Native (Expo)
How far Rork Companion's free device testing goes — and when to pay the $99 Apple Developer Program
Rork Companion lets you test on a real device without a paid Apple Developer account. Here is exactly where the free path stops, the concrete triggers for paying the $99, and what to stage before your first signed build — from running six apps as an indie developer.
The day I learned I could push to a real device for free, the first thing I did was dig out an older iPhone to keep as a test unit. With Rork Companion you can send a designed app to a physical device and tap through it without enrolling in the paid Apple Developer Program ($99/year). When I started building apps, the thing that ate the most time was never the implementation itself — it was getting to the point where the app actually ran on a device. So removing that one step from the cost equation matters more than it sounds.
But the free path has a clear ceiling, and the awkward part is that most people hit it at the worst possible moment: the day the app is finished and they try to ship it. If a $99 enrollment and a review queue land on top of your deadline, you lose a full day. Let me draw the line from running six apps solo: how far the free path stretches, which tasks force you to pay, and what to stage before you do.
What the free path actually covers
The Companion-plus-cloud-compile combination lets you run a real loop with no signing and no developer enrollment:
Design, generate, and edit entirely inside the browser (Chrome / Safari)
Build on a cloud-hosted Mac and stream a 60fps live simulator with real touch input
Transfer to your own physical iPhone through the Companion app and tap through it
Issue a share link so a friend can preview it through Companion on their device
At this stage you can verify most of the look and the raw feel: whether the UI holds together, whether navigation dead-ends, whether lists and forms render as expected. In my experience, roughly 70% of the defects worth catching in an AI-generated app surface on this free path. Navigation dead-ends, crashes on empty data, state that does not persist — these recurring patterns are easy to flush out in the live simulator before you ever transfer to a device.
The catch is that a Companion device transfer is not Apple's formal signing and distribution flow. Companion runs your app inside a preview runner, so anything that needs the OS's production entitlements will not behave as the real thing there.
Here is what specifically requires the $99 Apple Developer Program:
What you want to do
Free path?
What it needs
UI, navigation, raw interaction checks
Yes
Companion only
Feel it on your own physical device
Yes
Companion only
Production APNs push delivery
No
Developer Program + cert/key
Real StoreKit purchase testing (Sandbox)
No
App Store Connect (Program required)
TestFlight external beta distribution
No
Program + App Store Connect
App Store submission and release
No
Program + review
Certain capabilities (HealthKit/App Groups) on device
No
Signed development build
What is easy to miss: the features tied most directly to revenue live outside the free path. You can get some way with AdMob using test ads, but StoreKit subscriptions and one-time purchases effectively require Sandbox testing on a real signed build, which means App Store Connect — which means the Developer Program. Push is the same: Companion shows you local-notification behavior, but hitting production APNs from a server assumes a signed build. For the purchase side, I cover the structure in the StoreKit 2 in-app purchase notes.
✦
Thank you for reading this far.
Continue Reading
What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.
WHAT YOU'LL LEARN
✦Know exactly how far Companion's free on-device testing reaches without a paid Apple Developer account
✦Predict the walls you cannot cross without the $99 — TestFlight, production push, real StoreKit testing — before your work stalls
✦Get a pre-payment checklist for storage, permissions, and instrumentation so your first signed build does not waste a review cycle
Secure payment via Stripe · Cancel anytime
✦
Unlock This Article
Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.
If you decide "when to pay" by gut feel, you pay too early or too late. I treat the first time I hit any of these as the trigger. Paying too early leaves an annual fee idle; paying too late drops a review queue right after completion and kills momentum.
Your core revenue is push, IAP, or subscription — test ads cannot fully verify it, and you need the account from the design stage.
You want to hand it to testers other than yourself — Companion share links only go so far; TestFlight external testing requires the Program.
You need App Store-specific features at production parity — App Clips, widgets, Live Activities, and certain capabilities only render correctly on a signed build.
A launch date is now within one or two weeks — review round-trips need buffer days, so pay and clear the queue ahead of time.
Conversely, while you are still testing whether an idea becomes a real app, or polishing UI and raw feel, there is no reason to pay the $99. Buying more cheap iterations on the free path gets you closer to a good app. Rork itself starts free with paid plans from $25/month, and Rork Max is a separate track at $200/month — but the $99/year Apple Developer Program is best understood as an independent "toll on Apple's side," separate from any of those.
A pre-payment checklist to stage first
To avoid scrambling on your first signed build, a few things pay off if you finish them while still on the free path. Defer them and you will burn that precious first review cycle on configuration fixes right after paying.
1. Storage and assets
What the live simulator hides well is the weight of the first launch on a real device. For image-heavy apps especially, sort out density buckets and lazy loading while you are still unsigned. I once shipped a wallpaper app where I missed a density-split case and resources dropped out on low-density devices — exactly the kind of problem to kill before you reach a signed build.
2. Permission prompt order
Permission dialogs — ATT (App Tracking Transparency), notifications, photo library — feel completely different depending on order and timing. As a baseline, do not fire them all at first launch; show each one in context, just before the feature uses it, and bake that into code while you are still on the free path. For ordering SDK init against permission requests, see cold-start SDK orchestration.
3. An instrumentation base
If your first encounter with a crash happens on a signed build, isolating the cause takes time. While unsigned, put in at least a minimal crash-report and event base so verification after paying goes faster. Below is an app.json (Expo) template gathering the identifiers and permission strings worth locking in before you pay.
{ "expo": { "name": "MyApp", "slug": "my-app", "ios": { "bundleIdentifier": "design.dolice.myapp", "buildNumber": "1", "infoPlist": { "NSUserTrackingUsageDescription": "Used to tailor ads to your interests.", "NSPhotoLibraryAddUsageDescription": "Used to save wallpapers to your photo library.", "ITSAppUsesNonExemptEncryption": false } }, "android": { "package": "design.dolice.myapp", "versionCode": 1 } }}
Lock bundleIdentifier and package to their production values while still free — changing them later means redoing distribution. Declaring ITSAppUsesNonExemptEncryption up front keeps you from stalling on the export-compliance question at submission.
4. A pre-signing self-audit
The classic rejections are missing Info.plist permission strings and version mismatches. Running a small static check before you enter a signed build cuts down on first-submission bounces. Here is a minimal audit you can write in Node.
// presubmit-audit.js — minimal check to run before a signed buildconst fs = require("fs");const cfg = JSON.parse(fs.readFileSync("app.json", "utf8")).expo;const required = [ "NSUserTrackingUsageDescription", "NSPhotoLibraryAddUsageDescription",];const info = cfg.ios?.infoPlist ?? {};const missing = required.filter((k) => !info[k]);if (missing.length > 0) { console.error("Missing permission strings:", missing.join(", ")); process.exit(1);}if (!cfg.ios?.bundleIdentifier?.includes(".")) { console.error("bundleIdentifier is not finalized for production"); process.exit(1);}console.log("Self-audit passed");
The check is only a few dozen lines, but it is insurance against wasting a round-trip on your first review for a config slip. Running six apps in parallel, I kept tripping on the same spots at every submission, so I froze this kind of small audit into the pre-build step.
What the live simulator structurally cannot reproduce
When you decide how far to stretch the free path, it helps to be concrete about how the live simulator is fast and convenient but not the real thing. The following simply cannot be reproduced in a cloud simulator:
Frame drops from real-device thermal throttling (the stutter on long scrolls or video playback)
The OS forcibly terminating your app under memory pressure (jetsam)
The feel of real sensors and haptic feedback
The actual variance of weak signal or offline transitions
Even if you polish the UI perfectly on the free path, these can only be confirmed on a physical device (a Companion transfer). In my case, the memory-pressure terminations in an image-heavy app always surfaced only after I transferred to a device. That is exactly why splitting responsibilities works: flush out the raw behavior on the free path, then send only this layer to on-device verification.
A workflow that bridges free and paid
Put it all together and the order is this: do all idea validation and UI polish on the free path, finish the four staging items while unsigned, and pay the $99 the moment revenue features, external distribution, or a launch date comes into view.
The advantage of this shape is that your time after paying goes entirely to verification. Companion confirms the raw behavior, the signed build confirms production entitlements and purchases, and TestFlight puts it on other people's devices — three tiers with cleanly separated responsibilities. On shortening the release side, pairing this with the two-click publish flow reduces the submission friction further.
The free path exists to erase the friction before you start building; it does not stand in for the production path of revenue and distribution. Hold that line from the start and you get to choose the day you pay the $99 yourself. Start by connecting one spare device to Companion and running the self-audit script above against your app.json once. Thanks for reading.
Share
Thank You for Reading
Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.