Help us improve
Share bugs, ideas, or general feedback.
From beagle-ios
Reviews iOS animation code in Swift files for correctness, performance, accessibility, and Apple API best practices including withAnimation, PhaseAnimator, matchedGeometryEffect.
npx claudepluginhub existential-birds/beagle --plugin beagle-iosHow this skill is triggered — by the user, by Claude, or both
Slash command
/beagle-ios:ios-animation-code-reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
| Issue Type | Reference |
Reviews SwiftUI and Swift code for modern APIs, best practices, performance, accessibility, data flow, navigation, and Clean Architecture.
Reviews SwiftUI code for best practices, modern APIs, maintainability, performance, accessibility, and Swift conventions. Use when reading, writing, or reviewing SwiftUI projects.
Reviews SwiftUI code for view composition, state management (@State, @Binding, @Observable), performance, and accessibility. Use for .swift files with SwiftUI views or UI code.
Share bugs, ideas, or general feedback.
| Issue Type | Reference |
|---|---|
| Spring parameters, withAnimation misuse, phase/keyframe bugs | references/swiftui-animation-patterns.md |
| Frame drops, offscreen rendering, main thread blocking | references/performance.md |
| Reduce Motion, VoiceOver, motion sensitivity | references/accessibility.md |
| Transition protocol, matchedGeometryEffect, navigation transitions | references/transitions.md |
Report each finding as:
[FILE:LINE] ISSUE_TITLE
Example: [AnimatedCard.swift:42] Missing Reduce Motion fallback for spring animation
All details, code suggestions, and rationale follow after the header line.
@Environment(\.accessibilityReduceMotion) checked — animations have Reduce Motion fallback.sensoryFeedback) or audioduration/bounce parameters (not raw mass/stiffness/damping unless UIKit/CA).animation() without value: parameterwithAnimation wraps state changes, not view declarationsmatchedGeometryEffect IDs are stable and unique within the namespacegeometryGroup() used when parent geometry animates with child views appearingPhaseAnimator, symbolEffect) have finite phases or appropriate triggerCATransaction.setAnimationDuration() in UIView-backed layers (use UIView.animate instead)shadowPath (avoids per-frame recalculation).id() modifier (destroys view identity — use transition or matchedGeometryEffect instead)withAnimation scope issues → swiftui-animation-patterns.mdmatchedGeometryEffect glitches or custom Transition bugs → transitions.mdwithAnimation scoped to the minimal state change needed, or is it wrapping unrelated mutations?matchedGeometryEffect — are source and destination using the same ID and namespace, and is only one visible at a time?