macOS App Design
vaayne/mori
A skill your agent uses when designing or building native macOS applications with SwiftUI or AppKit.
Best practices and example-driven guidance for building native macOS SwiftUI scenes and components, including windows, commands, toolbars, settings, split views, inspectors, menu bar extras, and…
$ npx skills add robinebers/openusage --skill swiftui-patterns -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install robinebers/openusage swiftui-patterns --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/robinebers/openusage.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/swiftui-patterns .claude/skills/swiftui-patterns && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "swiftui-patterns" agent skill from https://github.com/robinebers/openusage/tree/main/.agents/skills/swiftui-patterns into .claude/skills/swiftui-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swiftui-patterns", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/robinebers/openusage/tree/main/.agents/skills/swiftui-patternsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add robinebers/openusage --skill swiftui-patterns -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install robinebers/openusage swiftui-patterns --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/robinebers/openusage.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/swiftui-patterns .agents/skills/swiftui-patterns && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "swiftui-patterns" agent skill from https://github.com/robinebers/openusage/tree/main/.agents/skills/swiftui-patterns into .agents/skills/swiftui-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swiftui-patterns", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add robinebers/openusage --skill swiftui-patterns -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install robinebers/openusage swiftui-patterns --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/robinebers/openusage.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/swiftui-patterns .cursor/skills/swiftui-patterns && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "swiftui-patterns" agent skill from https://github.com/robinebers/openusage/tree/main/.agents/skills/swiftui-patterns into .cursor/skills/swiftui-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swiftui-patterns", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/robinebers/openusage.git --path .agents/skills/swiftui-patterns--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add robinebers/openusage --skill swiftui-patterns -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install robinebers/openusage swiftui-patterns --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/robinebers/openusage.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/swiftui-patterns .gemini/skills/swiftui-patterns && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "swiftui-patterns" agent skill from https://github.com/robinebers/openusage/tree/main/.agents/skills/swiftui-patterns into .gemini/skills/swiftui-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swiftui-patterns", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install robinebers/openusage swiftui-patternsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add robinebers/openusage --skill swiftui-patterns -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/robinebers/openusage.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/swiftui-patterns .github/skills/swiftui-patterns && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "swiftui-patterns" agent skill from https://github.com/robinebers/openusage/tree/main/.agents/skills/swiftui-patterns into .github/skills/swiftui-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swiftui-patterns", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add robinebers/openusage --skill swiftui-patterns -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install robinebers/openusage swiftui-patterns --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/robinebers/openusage.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/swiftui-patterns .opencode/skills/swiftui-patterns && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "swiftui-patterns" agent skill from https://github.com/robinebers/openusage/tree/main/.agents/skills/swiftui-patterns into .opencode/skills/swiftui-patterns/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "swiftui-patterns", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
swiftui-patternsBest practices and example-driven guidance for building native macOS SwiftUI scenes and components, including windows, commands, toolbars, settings, split views, inspectors, menu bar extras, and…
Swiftui Patterns is an agent skill from robinebers/openusage. Best practices and example-driven guidance for building native macOS SwiftUI scenes and components, including windows, commands, toolbars, settings, split views, inspectors, menu bar extras, and keyboard-driven workflows. Use when creating or refactoring macOS SwiftUI UI, choosing scene types, wiring menus or settings, or needing desktop-specific component patterns and examples.
Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including reference files (for example `references/commands-menus.md`, `references/components-index.md` and `references/menu-bar-extra.md`).
It sits in Mobile, covering iOS development. It works with SwiftUI, macOS and Git. The repository describes itself as: Burning through your subscriptions too fast? Paying for stuff you never use? Stop guessing. OpenUsage is free and open source. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit cb21465. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Swiftui Patterns loads about 3.4k tokens when it runs, and up to ~5.9k if it reads all its reference files. Until then it costs about 100 tokens; SKILL.md has 1,613 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from robinebers/openusage at commit cb21465, republished under its MIT licence (© robinebers). 1,613 words, ~3,425 tokens.
.claude/skills/swiftui-patterns/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Choose a track based on your goal:
references/components-index.md.appkit-interop skill rather than forcing a shaky workaround.WindowGroup, Window, Settings, MenuBarExtra, or DocumentGroup.MenuBarExtra, use WindowGroup(..., id:) for the primary window when it should appear at launch. Treat Window(...) as a better fit for auxiliary/on-demand singleton windows; in menu-bar-heavy apps, a Window(...) scene may not present the main window automatically at launch.git rev-parse --is-inside-work-tree. If not, run git init at the project root so git-backed editor features unlock from the start. Do not initialize a nested repo inside an existing parent checkout.script/build_and_run.sh so the app has a single kill + build + run entrypoint from the start. Use the exact bootstrap contract from build-run-debug and its references/build-script.md file rather than inventing a second variant here.Color.primary, Color.secondary, semantic foreground styles, .regularMaterial, etc.) so the app follows Light/Dark mode automatically. Do not hardcode white or light backgrounds unless the user explicitly asks for a fixed theme, and do not reach for opaque windowBackgroundColor fills for root panes by default.For any non-trivial macOS app, start with this shape instead of putting the app, all views, models, stores, services, and helpers in one Swift file:
App/<AppName>App.swift: the @main app type and AppDelegate only.Views/ContentView.swift: root layout and high-level composition only.Views/SidebarView.swift, Views/DetailView.swift, Views/ComposerView.swift, etc.: feature views named after their primary type.Models/*.swift: value models, identifiers, and selection enums.Stores/*.swift: persistence and state stores.Services/*.swift: app-server, network, process, or platform clients.Support/*.swift: small formatters, resolvers, extensions, and glue helpers.Keep files small and named after the primary type they contain. If a file starts collecting unrelated views, models, stores, networking clients, and helper extensions, split it before adding more behavior.
Before writing the full UI:
script/build_and_run.sh separate from app source.ContentView.commands, toolbars, sidebars, inspectors, contextual menus, and searchable.MenuBarExtra item titles and action labels short and scannable. Cap visible menu item text at 30 characters; if source content is longer, truncate or summarize it before rendering and open the full content in a dedicated window or detail surface.MenuBarExtra app should still behave like a regular Dock app with a visible main window/process, install an NSApplicationDelegate via @NSApplicationDelegateAdaptor, call NSApp.setActivationPolicy(.regular) during launch, and activate the app with NSApp.activate(ignoringOtherApps: true). If the app is intentionally menu-bar-only, document that .accessory / no-Dock behavior is a deliberate product choice.NavigationSplitView sidebars or root window panes with opaque custom Color(...) or Color(nsColor: .windowBackgroundColor) fills by default. Prefer native macOS sidebar/window materials and system-provided backgrounds unless the user explicitly asks for a custom opaque surface. In sidebar-detail-inspector layouts, let the sidebar keep the standard source-list/material appearance and reserve custom backgrounds for detail or inspector content cards where needed.@SceneStorage for per-window ephemeral state and @AppStorage for durable user preferences.NavigationSplitView or a deliberate manual split layout over iOS-style stacked flows when the app benefits from always-visible structure.List(...).listStyle(.sidebar) and NavigationSplitView sidebars, prefer flat native rows with standard system selection/highlight behavior. Keep rows visually lightweight and Mail-like: at most one leading icon, one strong title line, and one optional secondary detail line in .secondary. Avoid stacked metadata rows, repeated inline utility icons, or dense multi-column status text in the sidebar. Reserve card-style and metadata-heavy surfaces for detail or inspector panes unless the user explicitly asks for a highly custom sidebar treatment.appkit-interop.Prefer a native source-list row shape:
List(selection: $selection) {
ForEach(items) { item in
HStack(spacing: 10) {
Image(systemName: item.systemImage)
.foregroundStyle(.secondary)
.frame(width: 16)
VStack(alignment: .leading, spacing: 2) {
Text(item.title)
.lineLimit(1)
if let detail = item.detail {
Text(detail)
.font(.caption)
.foregroundStyle(.secondary)
.lineLimit(1)
}
}
}
.tag(item.id)
}
}
.listStyle(.sidebar)This keeps selection, highlight, spacing, and scanability aligned with standard macOS sidebars. Keep each row to one icon maximum and one or two text lines maximum, with the second line reserved for a short detail label. Use richer card treatments and denser metadata in the detail or inspector content, not in every sidebar row.
Prefer letting the sidebar and split container use system backgrounds, while applying custom surfaces only to detail cards or inspector sections:
NavigationSplitView {
List(selection: $selection) {
ForEach(items) { item in
Label(item.title, systemImage: item.systemImage)
.tag(item.id)
}
}
.listStyle(.sidebar)
} detail: {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
DetailSummaryCard(item: selectedItem)
DetailMetricsCard(item: selectedItem)
}
.padding()
}
}Avoid painting the sidebar and root split panes with opaque custom fills by default:
NavigationSplitView {
List(items) { item in
SidebarCardRow(item: item)
}
.listStyle(.sidebar)
.background(Color(nsColor: .windowBackgroundColor))
} detail: {
DetailView(item: selectedItem)
.background(Color(.white))
}Use the narrowest state tool that matches the ownership model:
| Scenario | Preferred pattern |
|---|---|
| Local view or control state | @State |
| Child mutates parent-owned value state | @Binding |
| Root-owned reference model on macOS 14+ | @State with an @Observable type |
Child reads or mutates an injected @Observable model | Pass it explicitly as a stored property |
| Window-scoped ephemeral selection or expansion state | @SceneStorage when practical, otherwise scene-owned @State |
| Shared user preference | @AppStorage |
| Shared app service or configuration | @Environment(Type.self) |
| Legacy reference model on older targets | @StateObject at the owner and @ObservedObject when injected |
Choose the ownership location first, then the wrapper. Do not turn simple desktop state into a view model by reflex.
references/components-index.md: entry point for scene and component guidance.references/windowing.md: choosing between WindowGroup, Window, DocumentGroup, and window-opening patterns.references/settings.md: dedicated settings scenes, SettingsLink, and preference layouts.references/commands-menus.md: command menus, keyboard shortcuts, focused values, and desktop action routing.references/split-inspectors.md: sidebars, split views, selection-driven layout, and inspectors.references/menu-bar-extra.md: menu bar extra structure and when it fits.ContentView pretending the whole app is a single screen.@main app, all views, models, stores, networking/process clients, formatters, and extensions. This is acceptable only for tiny throwaway snippets under the new-app threshold above.Window(...) scene and then expecting the main window to appear at launch. Use WindowGroup(..., id:) for the primary launch window and reserve Window(...) for auxiliary/on-demand windows..background(.white), Color.white, or a fixed light palette in a brand-new scaffold without an explicit design requirement..sidebar list, which fights native source-list density, alignment, and selection behavior unless the user explicitly asked for a bespoke visual sidebar.NavigationSplitView sidebars or root window panes with opaque custom color fills by default, instead of letting the sidebar use native source-list/material appearance and reserving custom backgrounds for actual content cards.Use references/components-index.md as the entry point. Each component reference should include:
appkit-interop© robinebers, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (references) in .agents/skills/swiftui-patterns of robinebers/openusage.
Open the folder on GitHubat commit cb21465
Swiftui Patterns next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Swiftui Patterns this skillrobinebers/openusage | 4.3k | — | ~3.4k | Automated safety check: Pass | MIT | |
| macOS App Designvaayne/mori | 303 | — | ~789 | Automated safety check: Pass | MIT | |
| Pulse Releasequnqin24/Pulse | 516 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Swiftui Expert Skillomarshahine/HomeClaw | 176 | 4 repos | ~2.8k | Automated safety check: Pass | MIT | |
| Appkit Swiftui BridgeKartikLabhshetwar/better-shot | 2.4k | 2 repos | ~1.1k | Automated safety check: Pass | Custom licence | |
| macOS Notch UIfayazara/Screendrop | 2.1k | — | ~1.8k | Automated safety check: Pass | CC0-1.0 |
vaayne/mori
A skill your agent uses when designing or building native macOS applications with SwiftUI or AppKit.
qunqin24/Pulse
Release a new Pulse version end to end — checks, bilingual CHANGELOG entry, VERSION, tag, the release workflow, syncing main, and the issue replies that go with it.
omarshahine/HomeClaw
A skill your agent uses when writing, reviewing, or refactoring SwiftUI code for iOS or macOS, including state management, view composition, performance, Liquid Glass adoption, or Instruments .trace…
KartikLabhshetwar/better-shot
Expert guidance for hybrid AppKit-SwiftUI development. An agent skill from KartikLabhshetwar/better-shot.
fayazara/Screendrop
Add a Dynamic Island-style notch UI to a macOS app. An agent skill from fayazara/Screendrop.
raintree-technology/hig-doctor
Create or update a shared Apple design context document that other HIG skills use to tailor guidance.
robinebers/openusage
Add and verify lightweight macOS runtime telemetry. An agent skill from robinebers/openusage.
robinebers/openusage
Cut a release of OpenUsage (Swift menu-bar app): pick a version, generate a categorized changelog, tag from main, and publish the GitHub Release with notes.
robinebers/openusage
Add lightweight runtime telemetry and debug instrumentation to macOS apps, then verify those events after building and running.
robinebers/openusage
Customize macOS 15+ SwiftUI windows and scene behavior using Window, WindowGroup, and macOS window modifiers.
robinebers/openusage
Decide when and how to bridge a macOS app from SwiftUI into AppKit.
robinebers/openusage
Build, run, and debug local macOS apps and desktop executables using shell-first Xcode and Swift workflows.
Categories
Best practices and example-driven guidance for building native macOS SwiftUI scenes and components, including windows, commands, toolbars, settings, split views, inspectors, menu bar extras, and…. Swiftui Patterns is an agent skill from robinebers/openusage. Best practices and example-driven guidance for building native macOS SwiftUI scenes and components, including windows, commands, toolbars, settings, split views, inspectors, menu bar extras, and keyboard-driven workflows.
Swiftui Patterns fits situations like: refactoring macOS SwiftUI UI; choosing scene types; needing desktop-specific component patterns and examples.
Run `npx skills add robinebers/openusage --skill swiftui-patterns -a claude-code`. Or copy the skill folder (.agents/skills/swiftui-patterns in robinebers/openusage) into .claude/skills/swiftui-patterns in your project. Claude Code loads it when a task matches its description.
Run `npx skills add robinebers/openusage --skill swiftui-patterns -a codex`. Or copy the skill folder (.agents/skills/swiftui-patterns in robinebers/openusage) into .agents/skills/swiftui-patterns in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add robinebers/openusage --skill swiftui-patterns -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/swiftui-patterns, .gemini/skills/swiftui-patterns, .github/skills/swiftui-patterns and .opencode/skills/swiftui-patterns in your project.
Going by SKILL.md and its folder, Swiftui Patterns needs the command-line tools its instructions call (git).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Swiftui Patterns is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Swiftui Patterns: macOS App Design (vaayne/mori, 303 stars), Pulse Release (qunqin24/Pulse, 516 stars), Swiftui Expert Skill (omarshahine/HomeClaw, 176 stars) and Appkit Swiftui Bridge (KartikLabhshetwar/better-shot, 2.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
robinebers (a GitHub user) maintains it in robinebers/openusage, which has 4,333 GitHub stars. The repository holds 25 skills in this directory. The repository was last updated on October 6, 2026.
Source: robinebers/openusage on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.