How we got our iOS approved in first try

We shipped a native SwiftUI app for SpendCrypto.

badammm tsshhhh

Apple approved it on the first review! It’s live on Appstore

I’m not an iOS engineer. We already had a smooth web app and REST API. And I prompted my way to build the iOS app. Wouldn’t call it vibecoding, there’s a setup that we began with which steered the AI agents into building the right experience.

The codebase structure

Skills

Structure

While AI can invent the structure, it’ll sometimes do a lazy job of it without considering the future maintenance and compounding tech debt as we add new features.

We started manually defining this structure

ios-app/
  SKILL.md                 # router (skill #8)
  skills-lock.json         # pinned skill versions
  .agents/skills/          # the seven installed skills
  APP_STORE_SUBMISSION.md  # demo account, review notes, privacy table
  SpendCrypto/
    App/                   # entry, tabs, environment wiring
    Core/
      Auth/                # Keychain token, session
      Networking/          # APIClient, WebSocket, NetworkMonitor
      Services/            # catalog, orders, credits, referral, profile
      Models/
      Preview/             # isolated Xcode previews
    DesignSystem/          # colors, buttons, gift card tiles
    Features/
      Auth / Catalog / Cart / Order / Orders / Profile / Support

This app is not alone here. The web app and REST API backend are in the same workspace from where AI can pull a lot of context. See this cross-repo shared setup that I use in Cursor.

Better cross repo context in Cursor

I started building mobile apps for my webapp and it made me rethink the way context is shared across repos in my setup.

I have a backend in django and frontend in svelte. Two repos.

The skills

Skills played an important role in ensuring our app felt like a native iOS app, not a thin wrapper over our webapp.

There are tons of skills out there on skills.sh - but you gotta be judicious about which skills to add to your codebase. Too many skills will just bloat the context for AI, and some may even conflict with each other, because these are just succint prompts written by different people based on their judgements.

We selected these 6 skills

1. swiftui-patterns

This skill builds modern SwiftUI patterns targeting iOS 26+ with Swift 6.3. Covers architecture, state management, view composition, environment wiring, async loading, design polish, and platform/share integration.

Source: dpearson2699/swift-ios-skills

npx skills add https://github.com/dpearson2699/swift-ios-skills --skill swiftui-patterns

This is why the app isn’t a pile of ViewModels.

2. ios-hig-design

Make it look like a native iOS app. Default for anything visual. Tab bar (Shop / Orders / Cart / Account), NavigationStack, 44pt hit targets, safe areas, VoiceOver labels on gift card tiles and pickers etc

Source: wondelai/skills

npx skills add https://github.com/wondelai/skills --skill ios-hig-design

3. mobile-ios-design

This is a bit thinner version of HIG design. You can skip this one if you prefer. We kept it to pass in most prompts, and use the one above only when directed to use it.

Source: wshobson/agents

npx skills add https://github.com/wshobson/agents --skill mobile-ios-design

4. swiftui-animation

Motion with Reduce Motion. Used when something should move:

Shop → product zoom: matchedTransitionSource + .navigationTransition(.zoom)

Category chips: withAnimation(.easeInOut) plus Environment(.accessibilityReduceMotion) so it just scrollTo if the user asked for less motion

Voucher reveal: a short spring, not a circus

The skill’s whole point is: animate the state change, respect Reduce Motion, don’t put work inside the animation closure.

Source: dpearson2699/swift-ios-skills

npx skills add https://github.com/dpearson2699/swift-ios-skills --skill swiftui-animation

5. swiftui-performance

We used this skill primarily for code-review. It ensures you don’t make noob mistakes like loading a huge chunk and freeze app, running loops for animations.

Really useful when you don’t have deep knowledge about iOS patterns and building performance optimised apps.

Source: dpearson2699/swift-ios-skills

npx skills add https://github.com/dpearson2699/swift-ios-skills --skill swiftui-performance

6. app-store-review

Probably why we got through first try. Helps you catch App Store rejection risks before submission. Things like privacy, completeness, payments (most important one), ensuring you have a demo login that works.

Source: dpearson2699/swift-ios-skills

npx skills add https://github.com/dpearson2699/swift-ios-skills --skill app-store-review

Ensure that you use the usual Xcode flow for uploading your app archive to appstore connect and then manuall distribute from there. iOS review team treats cli submissions differently.

Also, we have a global manual skill which routes the AI to specific skills based on the prompt. This is useful to ensure skills are actually used when needed and you don’t have to keep prompting to use specific skills.

Lastly, use the right model when you’re planning and executing large tasks. I used Cursor with Grok 4.6 high effort for most prompts.