---
name: anti-ai-swift-patterns
description: Rules that stop the generic patterns AI falls into when building native Apple apps in SwiftUI. The native companion to anti-ai-patterns. Use whenever building, designing or reviewing an iOS, iPadOS, watchOS or macOS app interface.
---

# Anti AI patterns for SwiftUI

Apply these rules to every native app interface you build. They override your defaults. When in doubt, pick the less decorative option. They are the rules of anti-ai-patterns (https://akilastudio.com/skills/anti-ai-patterns.md) carried into SwiftUI; read that skill for the reasoning behind each one.

## Text and content

- **No eyebrows or decorative tags above headings.** The heading stands alone; if context is needed, it goes in the heading or the supporting text.
- **No widows or lopsided lines.** No last line with one or two loose words, and no long line over a short one.
- **No unnecessary supporting text.** If an element is clear on its own, it gets no extra text.
- **Avoid two-tone headings.** Allowed occasionally, never by default.
- **No AI copy.** Write plainly and concretely, the way a person would.
- **Never invent data.** No made-up stats, testimonials, names or reviews. If there is no real data, leave it out or use a clearly marked placeholder.

## Typical AI aesthetics (avoid)

- No purple/blue gradients.
- No emojis as icons.
- No glow.
- No heavy shadows on cards.
- No button labels in capitals.
- **Empty states with real content.** Not the same large icon, title and description, centered, every time.

## Surfaces and components

- **No cards inside cards.** One surface level. Separate inner content with space, not another box.
- **No one-sided borders on rounded elements.**
- **Concentric radii.** When a rounded element sits inside another, inner radius = outer radius − padding.
- **Images always fill a defined ratio.** `.aspectRatio(contentMode: .fill)` plus `.clipped()`, inside a frame with an explicit aspect ratio. Never stretched or squashed.
- **4-point scale.** Every numeric value is a multiple of 4.
- **Optically centered pills and buttons.** Never more space above the text than below, or the reverse. Check by eye.

## Adaptability

- **No fixed sizes.** No `.frame(width: 375)`. Layouts adapt to any width: landscape, iPad and the foldable iPhone.
- **Respect the safe areas.**
- **Dynamic Type.** Use the system text styles (`.body`, `.headline` and the rest), never a fixed `.font(.system(size: 17))`.

## Interaction and motion

- **No image zoom on tap.**
- **No filler animations.**
- **Haptics with judgment.** On actions that matter, not on every tap.
- **Loading states take the shape of the content.** `.redacted(reason: .placeholder)` or skeletons, not a spinner in the middle for everything.
- **Zero layout jumps.** Nothing moves or resizes on its own when content loads or changes.

## Paywalls

- **No tricks.** A visible close button, a clear price, "Restore Purchases", and links to the terms and the privacy policy, as Apple requires.

## Code

- **Current APIs.** `@Observable` instead of `ObservableObject`, async/await instead of callbacks, nothing deprecated (`NavigationView` and the like).
- **Spacing tokens on the 4-point scale.** No loose padding numbers.

## System components or custom UI

This skill does not choose between system components and custom UI: each project decides. When a component is custom, it must keep everything the native one gives for free: accessibility, Dynamic Type, a pressed state and dark mode.

## Before delivering

Go through every section above against what you built and fix any violation before handing it over.
