Xcode Cloud Wouldn't Create a Workflow for My New App. The Fix Was Unlinking GitHub.

I’ve had ten apps on Xcode Cloud without a single setup problem. Then I went to add the eleventh — Ajar, an iPhone SSH terminal for people who walk around the house with their laptop half-closed so the coding agent doesn’t die — and the wizard refused to finish.

The frustrating part wasn’t the failure. It was that the wizard never said what was wrong. It took three days of on-and-off poking, two wrong theories, and one lucky click in App Store Connect to get through it.

The symptom

Product → Integrate → Create Workflow. Pick the app. Then the “Grant Access to Your Source Code” step lists the primary repository plus every repo Xcode thinks it needs: swift-nio, swift-crypto, SwiftTerm, a handful of Apple’s other packages. All of them public. All of them showing no checkmark. No way to continue.

Pressing Grant bounced me to App Store Connect and then back to its home page with nothing granted. No error dialog. No log line. Just a wizard that wouldn’t move.

Wrong theory one: the public dependencies

The obvious read was that Xcode Cloud wanted access to those public repos and couldn’t get it. I checked each one: all public, all HTTPS, none renamed or archived. I also checked my other apps. Two of them depend on public third-party packages and never needed a grant for them. Xcode Cloud clones public repos anonymously. That’s documented and it matched my experience.

So the dependencies weren’t the problem. The wizard was just listing them.

Wrong theory two: the local packages

Ajar vendors two Swift packages as local packages inside the repo. Around the same time, the project file got regenerated on disk while Xcode had it open, and Xcode fell over with “Couldn’t load project” errors for both local packages and “Missing package product” on the app target. That looked like the culprit: if the package graph won’t load, the wizard has nothing to work with.

It was a real problem and a restart of Xcode fixed it. It was not the reason the wizard was stuck. After the restart the Grant Access step looked exactly the same.

What actually told me something

The wizard is a black box, but App Store Connect isn’t. With an API key you can ask it what Xcode Cloud actually knows:

GET /v1/ciProducts
GET /v1/scmProviders/{id}/repositories

Every other app was there with its repo. Ajar wasn’t. No product, and the repo wasn’t in the connected list. Whatever the wizard had shown over the previous days, nothing had ever been created on Apple’s side.

I also checked whether I could skip the wizard entirely and create the connection from a script:

POST /v1/ciProducts       → 403  does not allow 'CREATE'
POST /v1/scmRepositories  → 403  does not allow 'CREATE'
POST /v1/scmProviders     → 403  does not allow 'CREATE'

So no. The product and the GitHub authorization only get created through the wizard. You can manage workflows through the API afterwards, but you can’t bootstrap the connection.

The fix

App Store Connect → Users and Access → your own user → Integrations (under CI/CD). There’s a “Source Control Accounts” table with the linked GitHub account.

I unlinked it.

Then I went back to Xcode and continued the same Create Workflow flow I’d been fighting. This time it prompted to set up the GitHub connection from the top: sign in, authorize, pick the repo. The Grant Access step came back with checkmarks, the wizard finished, and the first build ran green.

My best guess is that the GitHub authorization App Store Connect had stored for my account had gone stale in some way that the Grant flow couldn’t repair. It worked for repos that were already connected and silently failed for a new one. Unlinking forced a fresh authorization. I can’t prove that’s the mechanism, because nothing in the process ever surfaced an error. I can only say that it’s the one change that made the difference.

What I’d do next time

If the Xcode Cloud wizard blocks on the Grant Access step and the repos it lists are public:

  1. Don’t chase the dependencies. Public packages don’t need grants.
  2. Check what App Store Connect actually has. If the product and repo aren’t there, the wizard hasn’t done anything yet, no matter what it showed.
  3. Unlink the GitHub account under your personal Integrations and rerun the wizard. Ten minutes, fully reversible, and it’s the thing that fixed it for me.

Three days for a ten-minute fix. The lesson I keep relearning with Apple’s developer tooling: when the UI gives you no error, stop reading the UI and go find a system that will tell you the truth. For Xcode Cloud, that’s the App Store Connect API.

The builds are green now, which means Ajar is on its way to TestFlight. If you’ve ever carried a MacBook from the desk to the couch with the lid at 45 degrees because Claude Code was mid-task, that’s the app: leave the session ajar, walk away, get pinged when it’s done, and pick it back up from your phone over plain SSH. No account, nothing to install on the Mac beyond an optional helper for the alerts. More on Ajar here.


You might also like