Five builds. Two rejections. Fourteen days between them, and the same guideline both times. This morning Apple rejected PalmAura for the second time under Guideline 4.3(b) — Design — Spam, and I'm calling it: the app is dead. Here's the autopsy, and the three things it taught me about shipping vibe-coded apps into Apple's walled garden.

TL;DR

The App Store has a wall up against vibe-coded apps — and honestly, it's a fair wall. My palm-reading app died at the door, twice, without a single user ever seeing it.

  • The build was the easy part. The plan-3x loop one-shotted the backend on Cloudflare Workers and got the Swift app out in a couple of shots. Apple's review loop then consumed two weeks and returned two identical rejections.
  • 4.3(b) doesn't review your code — it reviews your category. “There are already enough of these apps on the App Store.” Quality was never the question.
  • Agentic iOS development runs at the platform's speed, not the model's. My agents iterate in seconds and deploy to the web in about a minute. The iOS loop — compile, sign, device-test, TestFlight, review queue — is measured in days.
  • The thing I actually wanted to learn — App Store optimization and mobile marketing — I never got to touch. You can't study the market from outside the door.

PalmAura joins Kapiko in the graveyard.

What I shipped

PalmAura was a palm-reading iOS app: photograph your palm, get a daily read. Freemium, one photo in, one reading out. A fun, contained experiment — and the first real test of whether my web-honed build loop could ship a native app.

Mechanically, it could. The backend was a clean one-shot on Cloudflare Workers — the same stack as everything else I run. The Swift app itself came out in two or three shots with the plan-three-times loop. By the standards of my web projects, that's a normal, boring, successful build. The product worked.

PalmAura in motion — palm photo in, daily read out. The app no user will ever download.

Two rejections, one guideline

App Store Connect showing the PalmAura app with a red badge: iOS 1.0 Rejected.
The whole story, in one App Store Connect row.

I submitted on May 26. Rejected: Guideline 4.3(b) — Design — Spam. I revised, resubmitted, and waited. On June 9 — fourteen days and five builds after the first attempt — the second verdict came back. Same guideline, nearly word for word:

The app primarily features astrology, horoscopes, palm reading, fortune telling or zodiac reports that duplicate the content and functionality of similar apps in a saturated category. … These app features may be useful, informative or entertaining, and the app may include features or characteristics that distinguish it. However, there are already enough of these apps on the App Store.
Apple App Review rejection message, June 9 2026: Guideline 4.3(b) Design - Spam, citing a saturated category of astrology, horoscope, palm reading and fortune telling apps.
The second rejection, June 9. Reviewed on an iPhone 17 Pro Max, version 1.0, build 5.

Read that rejection carefully, because it's not saying what most rejections say. There's no bug report. No crash log. No complaint about the UI, the IAP flow, or the privacy policy. Apple is explicitly conceding the app “may be useful, informative or entertaining” and might even be distinguishable — and rejecting it anyway. 4.3(b) doesn't review your app. It reviews your category, and the category is full.

I think this is Apple's wall against the vibe-coding flood, and the timing isn't a coincidence. When a competent agent loop can produce a working app in an afternoon, the marginal cost of a “me too” app falls to roughly zero — and the App Store's failure mode becomes ten thousand palm readers, horoscope generators, and meditation timers, each slightly restyled. Google answered the same flood by burying new sites. Apple's answer is a bouncer at the door who doesn't care how nice your shirt is: the bar is full of guys in that shirt.

And here's the uncomfortable, non-negotiable part: by Apple's definition, they were right. PalmAura was a well-built entry in a saturated category. It had a clean gimmick, not a unique experience. If I ran the platform and watched agentic submissions climb, I'd build the same wall. The rejection stings; the logic doesn't.

The loop is the product

The second lesson cost me the two weeks. My entire operation is tuned around one number: how fast a change gets in front of reality. On the web that loop is about a minute — an agent edits, pushes, Cloudflare deploys, and the change is live in production where I (or a cron job) can see it. Every piece of my stack compounds around that speed.

iOS runs the same loop through a different physics. The model still writes Swift in seconds — that part is identical. Then: Xcode compiles. The simulator approximates. The real test wants a provisioning profile, a signed build, a physical phone. TestFlight wants processing time. And the only deploy that counts — the App Store — wants days of review queue before a human tells you no. The agent iterates at model speed; the platform iterates at Apple speed. The bottleneck moved from generation to ceremony, and ceremony is the one thing an agent can't compress.

The math on PalmAura: the build took shots measured in single digits, days one and two. The remaining twelve days were the wall-clock cost of two trips through a review queue. My whole pipeline ships multiple projects to production per day; this one platform turned a weekend product into a fortnight of waiting for two form rejections. Even if Apple had said yes, every future bugfix, every experiment, every A/B test would pay the same toll. The web spoiled me, and I'm not sorry.

The class I never got to take

Here's the regret that actually matters. I didn't build PalmAura because the world needed another palm reader — I built it to learn a new surface. The plan was: ship the app, then learn App Store optimization the way I learned SEO — keywords, screenshots, ratings velocity, paid acquisition, the whole discipline. Add “mobile distribution” as a card to the deck, next to search, social, and Amazon.

I never got to take the class. ASO assumes you're in the store. All the playbooks I'd queued up — useless from outside the door. Which is itself the lesson: on the web, distribution is a skill problem you can start learning the day you deploy. On iOS, distribution begins with a gatekeeper's permission, and the gatekeeper has opinions about your category before your skill ever enters the conversation. I wish I'd understood how absolute that ordering was before I started; it would have changed what I built, or whether I built it at all.

To the graveyard

Apple's rejection email, in its “Resources” section, offers a consolation suggestion: “You may consider creating a web app, which looks and behaves like a native app.” Apple, after two weeks of deliberation, advised me to do the thing my entire company already does. Noted, and genuinely a little funny.

But I'm not porting PalmAura to the web, because the honest read is that it was a category entry, not a conviction — and the category is as saturated outside the store as inside it. The experiment answered its real questions: yes, the agentic loop can ship native apps; no, the economics don't work when the platform's ceremony eats the loop's speed advantage; and no, Apple is not going to let the flood in. Three answers for two weeks and a $99 developer account — cheaper than most tuition.

So: Kapiko has company. PalmAura goes to the graveyard — playable, like everything else I bury — and the deck loses its mobile card for now. The next time I want a new surface, I'll pick one where the door opens from my side.