close
Macless
Blog

Notes on shipping iOS apps without a Mac

GitHub Actions, code signing, App Store Connect — the stuff that comes up along the way, written as I actually hit it.

Fix ITMS-90168: "The binary you uploaded was invalid"

Apple's catch-all error — the message is identical whether the real cause is architecture, Info.plist, or your embedded provisioning profile. Here's how to actually find out which.

Read →

Fix ITMS-90717: "Invalid App Store Icon"

Three checks the 1024×1024 marketing icon has to pass. It's usually the second one — an invisible alpha channel — that catches people.

Read →

Fix ITMS-90683: "Missing purpose string in Info.plist"

Unlike most ITMS errors, this one only means one thing. The hard part is finding which key — especially when a dependency pulled it in, not you.

Read →

Fix "Provisioning profile doesn't match the entitlements file"

The error names two entitlement keys, but it's almost always one of two root causes — and neither of them is a mistake in your entitlements file.

Read →

Fix "No matching provisioning profiles found" in GitHub Actions

This one usually isn't about the profile at all — it's about whether Xcode is even looking at the profile you installed.

Read →

Fix "keystore was tampered with, or password was incorrect"

The error names two causes, but they're not equally likely — check the boring one (a bad password secret) before you assume your keystore is corrupted.

Read →

Fix "Provisioning profile doesn't include signing certificate"

Confusing because nothing looks wrong — the profile isn't expired, the bundle ID matches. Here's what's actually pinned to what, and the two-command way to confirm it before you regenerate anything.

Read →

Set it up once. Stop thinking about it.

A setup wizard that runs the signing commands for you, a free Signing Doctor that now reads Android keystores too, and a workflow that catches an expiring certificate before it catches you.

Read →

A header scan says 16/16. Here's what it can't see.

A reader caught six real missing headers on macless.dev. Getting to 16/16 clean was the easy part — here's what checking the CI/secrets layer underneath actually turned up.

Read →

Fix "No signing certificate matching team ID" in GitHub Actions

The three things that actually cause this error, and how to tell which one you've hit before you start regenerating things at random.

Read →

Why your TestFlight build doesn't show up after a successful upload

Your CI log says success. TestFlight shows nothing. Here's the silent failure behind it, and the one-line fix.

Read →

GitHub Actions' free macOS minutes, explained

What's actually free, what isn't, and what a private repo costs on top of it.

Read →

The actual cost of shipping an iOS app in 2026

Every line item — Apple's fee, hardware, CI — added up, so you know the total before you start.

Read →

How to build and ship an iOS app without a Mac

Every option — buying a Mac, renting a cloud one, or using GitHub Actions' free macOS build minutes — with actual costs and the pitfalls each one hits.

Read →