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-expertdata-ai
license: Apache-2.0 NOT for unrelated tasks outside this domain.
development
Use when designing caching strategies (cache-aside, write-through, write-behind), implementing distributed locks, building rate limiters, leaderboards, real-time streams (XADD/consumer groups), pub/sub, or tuning eviction policies. Triggers: thundering-herd on cache miss, dogpile on key expiry, Redlock vs SET-NX-PX choice, sliding-window rate limiter, hot-key on a single cluster slot, big-key blowup, MULTI/EXEC across slots, KEYS in production. NOT for Redis Cluster operations/admin (different domain), embedded KV (SQLite, leveldb), in-process LRU caches, or Memcached.
tools
Drawing the `'use client'` boundary correctly in React Server Components apps (Next.js App Router, RSC frameworks) — leaf-pushing, slot composition, serialization rules, and environment poisoning prevention. Grounded in react.dev and Next.js 16 docs.
development
Use when designing rate limiting for an API, choosing between token bucket / sliding window / leaky bucket / fixed window, implementing it in Redis, deciding edge (Cloudflare/Upstash) vs origin enforcement, sizing per-user vs per-IP vs per-endpoint quotas, returning the right 429 response with Retry-After, or fixing the boundary-burst bug in fixed-window limiters. Triggers: 429 too many requests, INCR + EXPIRE, ZADD + ZREMRANGEBYSCORE + ZCARD, X-RateLimit-Remaining header, Cloudflare WAF rate limiting rules, Upstash @upstash/ratelimit, leaky bucket shaping vs policing, distributed rate limiter consistency. NOT for DDoS mitigation specifically (different scale), CAPTCHA / bot management, full WAF design, or per-user quota billing.