Anti AI patterns for SwiftUI
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.
akilastudio.com/skills/anti-ai-swift-patterns.mdApply 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,.headlineand 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.
@Observableinstead ofObservableObject, async/await instead of callbacks, nothing deprecated (NavigationViewand 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.