skills/native-app-designer/SKILL.md
Creates breathtaking iOS/Mac and web apps with organic, non-AI aesthetic. Expert in SwiftUI, React animations, physics-based motion, and human-crafted design. Use for iOS/Mac app UI, React/Vue animations, native-feel web apps, physics-based motion design. Activate on "SwiftUI", "iOS app", "native app", "React animation", "motion design", "UIKit", "physics animation". NOT for backend logic, API design (use backend-architect), simple static sites (use web-design-expert), or pure graphic design (use design-system-creator).
npx skillsauth add curiositech/windags-skills native-app-designerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Elite native app designer specializing in breathtaking, human-centered applications that feel organic and alive—never generic or AI-generated.
User Action Type:
├── Immediate Feedback (button press, tap)
│ ├── Success: 0.1s spring (response: 0.3, damping: 0.7)
│ └── Error: 0.15s + haptic feedback
├── Content Transition (page change, modal)
│ ├── Forward navigation: 0.25s slide-right
│ ├── Back navigation: 0.2s slide-left (faster return)
│ └── Modal present/dismiss: 0.3s scale + fade
├── Data Loading States
│ ├── <2s expected: Skeleton animation
│ ├── 2-5s expected: Progress indicator + entertainment
│ └── >5s expected: Cancellable with progress details
└── Celebration/Success
├── Minor success: 0.4s gentle bounce
├── Major success: 0.8s confetti + sound
└── Achievement: 1.2s dramatic scale + particle effects
IF user context = "work/productivity"
→ Use Professional personality (crisp, confident, muted colors)
ELSE IF user context = "entertainment/social"
→ Use Playful personality (bouncy springs, warm colors)
ELSE IF user context = "wellness/meditation"
→ Use Natural personality (organic motion, earthy colors)
ELSE IF user context = "finance/serious"
→ Use Minimal personality (subtle motion, limited palette)
ELSE
→ Default to Vibrant personality (energetic, bold colors)
Target Platform:
├── iOS Native
│ ├── Use SwiftUI for iOS 14+ → spring animations, SF Symbols
│ ├── Use UIKit for iOS 13- → Core Animation, manual spring curves
│ └── Add haptic feedback for all key interactions
├── Web Progressive
│ ├── Use Framer Motion for React → physics-based animations
│ ├── Use GSAP for vanilla JS → 60fps performance
│ └── Implement reduced motion support
└── Cross-platform
├── Use Lottie for complex animations → After Effects export
├── Focus on transform/opacity → hardware acceleration
└── Fallback to CSS transitions for low-end devices
Detection: If every component is a white/gray card with identical shadows and spacing Symptoms: UI feels monotonous, looks AI-generated, lacks visual hierarchy Fix: Mix component types (cards, lists, overlays, inline elements), vary corner radius (8px-24px), use purposeful asymmetry
Detection: If animations use .linear() or constant easing everywhere
Symptoms: Interactions feel robotic, unnatural, lifeless
Fix: Replace with spring physics: .spring(response: 0.3-0.8, dampingFraction: 0.5-0.8), match animation personality to app context
Detection: If using >5 colors with no restraint or hierarchy Symptoms: Overwhelming interface, no focal points, visual chaos Fix: Limit to 3-4 colors max, use 60/30/10 rule (60% neutral, 30% primary, 10% accent), semantic color usage only
Detection: If every element animates simultaneously or constantly Symptoms: User can't focus, feels dizzy, performance issues Fix: Animate max 2-3 elements per interaction, stagger timing by 50-100ms, use animation sparingly for feedback only
Detection: If margins/padding use random values (7px, 13px, 19px) Symptoms: Interface feels unpolished, chaotic, amateur Fix: Adopt 4pt or 8pt grid system (4, 8, 12, 16, 24, 32px), create spacing tokens, use systematic spacing scale
Before: Generic white card with linear transitions
// Anti-pattern: Generic, lifeless
VStack {
AsyncImage(url: product.imageURL)
Text(product.name)
Text("$\(product.price)")
}
.background(.white)
.cornerRadius(8)
.shadow(radius: 2)
.animation(.linear(duration: 0.2)) // WRONG
Decision Process:
After: Organic, delightful interaction
struct DelightfulProductCard: View {
@State private var isPressed = false
var body: some View {
VStack(alignment: .leading, spacing: 12) {
AsyncImage(url: product.imageURL)
.frame(height: 200)
.clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous))
.scaleEffect(isPressed ? 0.95 : 1.0)
VStack(alignment: .leading, spacing: 4) {
Text(product.name)
.font(.system(.title3, design: .rounded, weight: .bold))
Text("$\(product.price)")
.font(.title2)
.foregroundStyle(.green)
}
}
.padding(16)
.background(.ultraThinMaterial)
.clipShape(RoundedRectangle(cornerRadius: 20, style: .continuous))
.scaleEffect(isPressed ? 0.98 : 1.0)
.animation(.spring(response: 0.3, dampingFraction: 0.7), value: isPressed)
.onTapGesture {
// Haptic feedback for premium feel
let impact = UIImpactFeedbackGenerator(style: .medium)
impact.impactOccurred()
}
.pressEvents {
onPress: { isPressed = true }
onRelease: { isPressed = false }
}
}
}
Expert insights caught:
Decision Process:
Implementation:
const ProfessionalLoader = ({ duration = 3000 }) => {
const [progress, setProgress] = useState(0);
// Smooth progress curve (not linear)
useEffect(() => {
const interval = setInterval(() => {
setProgress(prev => Math.min(prev + (100 / (duration / 100)), 100));
}, 100);
return () => clearInterval(interval);
}, [duration]);
return (
<motion.div
className="loader-container"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.3 }}
>
<motion.div
className="progress-bar"
style={{ width: `${progress}%` }}
transition={{ type: "spring", stiffness: 100 }}
/>
<motion.p
animate={{ opacity: [0.6, 1, 0.6] }}
transition={{ duration: 1.5, repeat: Infinity }}
>
Securing your data...
</motion.p>
</motion.div>
);
};
Trade-off Analysis:
Animation Quality:
Visual Hierarchy:
Platform Integration:
Brand Consistency:
Do NOT use this skill for:
backend-architect insteadbackend-architect insteadweb-design-expert insteaddesign-system-creator insteadadhd-design-expert insteadweb-design-expert insteaddesign-system-creator insteadDelegate to other skills when:
backend-architectadhd-design-expertvaporwave-glassomorphic-ui-designerdesign-system-creatormetal-shader-experttools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.