Help us improve
Share bugs, ideas, or general feedback.
From build-macos-apps
Decide when and how to bridge a macOS app from SwiftUI into AppKit. Use when implementing NSViewRepresentable or NSViewControllerRepresentable, accessing NSWindow or the responder chain, presenting panels, customizing menus, or handling desktop behaviors that SwiftUI does not model cleanly.
npx claudepluginhub robinebers/converted-plugins --plugin build-macos-appsHow this skill is triggered — by the user, by Claude, or both
Slash command
/build-macos-apps:appkit-interopThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this skill when SwiftUI is close but not quite enough for native macOS behavior.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Use this skill when SwiftUI is close but not quite enough for native macOS behavior. Keep the bridge as small and explicit as possible. SwiftUI should usually remain the source of truth, while AppKit handles the imperative edge.
NSViewRepresentable when you need a specific AppKit view with lightweight lifecycle needs.NSViewControllerRepresentable when you need controller lifecycle, delegation, or presentation coordination.NSWindow, responder-chain, menu validation, panels, or app-level behavior.Name the capability gap precisely.
Pick the smallest boundary that solves it.
Keep ownership explicit.
Expose a narrow interface back to SwiftUI.
Validate lifecycle assumptions.
references/representables.md: choosing between view and view-controller wrappers, plus coordinator patterns.references/window-panels.md: window access, utility windows, and open/save panels.references/responder-menus.md: first responder, command routing, and menu validation.references/drag-drop-pasteboard.md: pasteboard, file URLs, and desktop drag/drop edges.Coordinator become an unstructured dumping ground.NSView or NSWindow instances globally without a strong ownership reason.swiftui-patterns, keep it there.Provide: