
Watchos Design
- 9 installs
- 33 repo stars
- Updated July 27, 2026
- dirnbauer/webconsulting-skills
Design glanceable watchOS apps and complications with 2-second comprehension, high-contrast text, and Digital Crown interaction.
About
This skill applies Apple Human Interface Guidelines for Apple Watch, prioritizing glanceable design, Digital Crown input, and brief interactions. A developer uses it when building watchOS apps, complications, or workout features.
- Glanceable design: key information visible within 2 seconds and without scrolling
- Covers Digital Crown, complications, and wrist-based interaction sessions
Watchos Design by the numbers
- 9 all-time installs (skills.sh)
- Ranked #1,468 of 1,880 Design & UI/UX skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/dirnbauer/webconsulting-skills --skill watchos-designAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 9 |
|---|---|
| repo stars | ★ 33 |
| Last updated | July 27, 2026 |
| Repository | dirnbauer/webconsulting-skills ↗ |
What it does
Design glanceable watchOS apps and complications with 2-second comprehension, high-contrast text, and Digital Crown interaction.
Files
watchOS Design Guidelines
Apple Watch is a personal, glanceable device worn on the wrist. Interactions are measured in seconds, not minutes. Every design decision must prioritize speed of comprehension and brevity of interaction.
---
1. Glanceable Design (CRITICAL)
The defining constraint of watchOS. If a user cannot extract the key information within 2 seconds of raising their wrist, the design has failed.
Rules
- W-GL-01: Primary information must be visible without scrolling. The first screen is the only guaranteed screen.
- W-GL-02: Target interaction sessions of 5 seconds or less. Design for raise-glance-lower.
- W-GL-03: Use large, high-contrast text. Minimum effective body text is 16pt (system font). Titles should be 18pt or larger.
- W-GL-04: Limit text to essential content. Truncate or abbreviate aggressively. Use SF Symbols instead of text labels where meaning is unambiguous.
- W-GL-05: Respect wrist-down time. When the wrist lowers, the app enters an inactive state. Do not assume continuous user attention.
- W-GL-06: Prioritize a single piece of information per screen. If showing multiple data points, establish clear visual hierarchy with size, weight, and color.
Screen Dimensions Reference
| Device | Screen Width | Screen Height | Corner Radius |
|---|---|---|---|
| 41mm (Series 9) | 176px | 215px | 36px |
| 45mm (Series 9) | 198px | 242px | 39px |
| 42mm (Series 10) | 180px | 220px | 37px |
| 46mm (Series 10) | 205px | 251px | 40px |
| 49mm (Ultra 2) | 205px | 251px | 40px |
Anti-Patterns
- Walls of text requiring scroll to understand context
- Small, dense data tables
- Requiring multiple taps before showing useful information
- Replicating an iPhone screen layout on Watch
---
2. Digital Crown (HIGH)
The Digital Crown is the primary physical input for scrolling and precise value selection. It provides haptic feedback and should feel purposeful.
Rules
- W-DC-01: Use the Digital Crown as the primary scroll mechanism for vertical content. Do not rely solely on swipe gestures for scrolling.
- W-DC-02: For value pickers (time, quantity, sliders), bind the Crown to precise adjustments with haptic detents at each discrete value.
- W-DC-03: Do not override or conflict with system Crown behaviors. The system uses the Crown for volume control during media playback, scrolling in system UI, and Time Travel in complications.
- W-DC-04: Provide visual feedback synchronized with Crown rotation. The UI must respond frame-by-frame to Crown input with no perceptible lag.
- W-DC-05: Update on each Crown increment. Values, selection, and highlight states should move with each detent. Do not debounce Crown input until the gesture ends.
Correct — Crown binding with haptic detents:
struct VolumePickerView: View {
@State private var volume: Double = 0.5
var body: some View {
VStack {
Text("\(Int(volume * 100))%")
.font(.title.bold())
Image(systemName: "speaker.wave.3")
}
.focusable()
.digitalCrownRotation(
$volume,
from: 0.0,
through: 1.0,
by: 0.05,
sensitivity: .medium,
isContinuous: false,
isHapticFeedbackEnabled: true
)
}
}Incorrect — ignoring the Crown and forcing touch-only interaction:
struct VolumePickerView: View {
@State private var volume: Double = 0.5
var body: some View {
Slider(value: $volume)
// No .digitalCrownRotation — Crown input is ignored
// Users must use touch-only, which is imprecise and frustrating on Watch
}
}Anti-Patterns
- Ignoring the Crown and forcing all interaction through touch
- Custom Crown behaviors that conflict with system expectations
- Missing haptic feedback on discrete value changes
- Laggy or batched responses to Crown rotation
---
3. Navigation (HIGH)
Watch navigation must be shallow and predictable. Users should never feel lost or unable to return to a known state.
Rules
- W-NV-01: Use vertical page scrolling as the default content navigation pattern. Pages scroll top-to-bottom with the Digital Crown.
- W-NV-02: Use
TabViewfor top-level sections (max 5 tabs). Swipe horizontally between tabs. Each tab is a distinct functional area. - W-NV-03: Use
NavigationStackfor hierarchical drill-down. Limit hierarchy to 2-3 levels maximum. Every pushed view must have a back button (provided automatically by the system). - W-NV-04: Avoid modal sheets for primary flows. Modals should be reserved for focused, single-purpose tasks (e.g., confirmation, quick input).
- W-NV-05: The app's most important action should be reachable within 1 tap from launch. Do not bury primary functionality behind menus or navigation.
Navigation Pattern Reference
| Pattern | Use Case | Gesture |
|---|---|---|
| Vertical scroll | Long-form content within a single view | Digital Crown / swipe up-down |
| TabView (horizontal pages) | Top-level app sections | Swipe left-right |
| NavigationStack (push/pop) | Hierarchical drill-down | Tap to push, swipe right or back button to pop |
| Modal sheet | Confirmation, focused input | Presented programmatically, dismiss via button or swipe down |
Anti-Patterns
- Deep navigation hierarchies (4+ levels)
- Hamburger menus or hidden navigation drawers
- Tab bars with more than 5 items
- Forcing users to scroll through long lists to find key actions
---
4. Complications (HIGH)
Complications are the most visible surface of a Watch app. They live on the watch face and provide at-a-glance data without launching the app.
Rules
- W-CP-01: Support multiple complication families to maximize watch face compatibility. At minimum support
accessoryCircular,accessoryCorner, andaccessoryRectangular(WidgetKit, watchOS 9+). - W-CP-02: Provide both tinted (single-color) and full-color variants. Tinted complications must remain legible when the system applies a single tint color.
- W-CP-03: Update complications via
TimelineProvider. Provide future timeline entries when data is predictable (e.g., next calendar event, weather forecast). Keep data fresh -- stale complications erode trust. - W-CP-04: Complication content must be meaningful without context. A user glancing at their watch face should immediately understand the data (e.g., "72F" not "72").
- W-CP-05: Tapping a complication must launch the app to a relevant context, not just the app's root view.
Correct — WidgetKit TimelineProvider for an accessoryCircular complication:
struct StepCountProvider: TimelineProvider {
func placeholder(in context: Context) -> StepEntry {
StepEntry(date: Date(), steps: 5000)
}
func getSnapshot(in context: Context, completion: @escaping (StepEntry) -> Void) {
completion(StepEntry(date: Date(), steps: HealthStore.shared.todaySteps))
}
func getTimeline(in context: Context, completion: @escaping (Timeline<StepEntry>) -> Void) {
let entry = StepEntry(date: Date(), steps: HealthStore.shared.todaySteps)
// Refresh in 15 minutes
let nextUpdate = Calendar.current.date(byAdding: .minute, value: 15, to: Date())!
completion(Timeline(entries: [entry], policy: .after(nextUpdate)))
}
}
struct StepCountComplicationView: View {
let entry: StepEntry
var body: some View {
Gauge(value: Double(entry.steps), in: 0...10000) {
Image(systemName: "figure.walk")
} currentValueLabel: {
Text("\(entry.steps / 1000)k")
}
.gaugeStyle(.accessoryCircular)
}
}Complication Family Reference
Use WidgetFamily values:
| Family | Shape | Typical Content |
|---|---|---|
accessoryCircular | Small circle | Single value, icon, or gauge |
accessoryCorner | Curved, top corners | Gauge with label, or text with icon |
accessoryRectangular | Wide rectangle | Multi-line text, chart, or detailed view |
accessoryInline | Text row | Short label or value |
Anti-Patterns
- Supporting only one complication family
- Stale data that does not update for hours
- Complication tap landing on generic app home instead of relevant content
- Illegible complications in tinted mode (insufficient contrast)
---
5. Always On Display (MEDIUM)
When the user's wrist is down, watchOS enters an Always On state showing a dimmed version of the current app. This must be handled intentionally.
Rules
- W-AO-01: Reduce visual complexity in the Always On state. Remove animations, secondary UI elements, and non-essential detail. Keep only the most critical information visible.
- W-AO-02: Hide sensitive or private data (e.g., message content, health details, financial information) in the dimmed state. Use redacted or placeholder content.
- W-AO-03: Reduce update frequency in Always On. Update the display no more than once per minute. Use
TimelineViewwith a.everyMinuteschedule for time-sensitive content. - W-AO-04: Use the system-provided dimming behaviors. Do not implement custom dimming. The system automatically reduces brightness and can apply a tint. Ensure your content remains legible at reduced brightness.
- W-AO-05: Test both active and Always On states. The transition between states must feel seamless -- layout should not shift or jump when the wrist raises.
Anti-Patterns
- Showing identical UI in active and Always On states (wastes battery, may expose private data)
- Animations or frequent updates in Always On state
- Layout shifts when transitioning between active and dimmed states
- Forgetting to redact sensitive information
---
6. Workouts & Health (MEDIUM)
Workout and health apps have unique requirements: extended sessions, live metrics, and body-awareness features.
Rules
- W-WK-01: Display live workout metrics in large, high-contrast text. Heart rate, duration, distance, and calories should be readable mid-exercise without stopping.
- W-WK-02: Use haptic feedback for milestones (lap completed, goal reached, heart rate zone change). Haptics are essential because users may not be looking at the screen during exercise.
- W-WK-03: Support auto-pause detection for relevant workout types (running, walking). Users expect the workout to pause when they stop moving and resume when they start again.
- W-WK-04: Enable WaterLock during swimming workouts. This disables the touchscreen to prevent water interaction. The Digital Crown is used to eject water and unlock.
- W-WK-05: Show a clear summary screen at workout completion with key metrics. Allow the user to save or discard the workout with a single action.
Anti-Patterns
- Small metric text that requires squinting or stopping to read
- Missing haptic feedback for important workout events
- No auto-pause support for outdoor workouts
- Requiring complex interaction to end or save a workout
---
7. Notifications (MEDIUM)
Watch notifications must be brief and actionable. The user's wrist is raised for only a moment.
Rules
- W-NT-01: Design Short Look notifications with only a title, app icon, and app name. This is what the user sees on initial wrist raise. It must communicate the notification's purpose instantly.
- W-NT-02: Design Long Look notifications with full content and up to 4 action buttons. The user reaches Long Look by continuing to look at the notification. Include the most useful actions inline.
- W-NT-03: Use appropriate haptic notification types. Match the urgency:
.notificationfor standard alerts,.directionUpfor positive events,.directionDownfor negative events,.success/.failure/.retryfor outcomes. - W-NT-04: Do not over-notify. Excessive notifications cause users to disable them entirely. Batch non-urgent updates. Reserve Watch notifications for time-sensitive or actionable information.
Haptic Type Reference
| Haptic | Use Case |
|---|---|
.notification | General alerts |
.directionUp | Positive event (goal reached, stock up) |
.directionDown | Negative event (stock down, weather warning) |
.success | Action completed successfully |
.failure | Action failed |
.retry | Try again prompt |
.start | Activity beginning |
.stop | Activity ending |
.click | Discrete selection (Crown detent, picker) |
Anti-Patterns
- Sending every iPhone notification to the Watch
- Notifications without actionable buttons (forcing app launch)
- Using the same haptic type for all notifications regardless of content
- Long notification text that requires extensive scrolling
---
8. Accessibility (CRITICAL)
Apple Watch supports VoiceOver and other assistive technologies. Complications and app UI must be accessible.
Rules
- W-AC-01: Every interactive element must have a meaningful accessibility label. SF Symbol names are not sufficient labels. Use
.accessibilityLabel()on image-only buttons. - W-AC-02: VoiceOver must be able to navigate all app content. Do not hide essential information from the accessibility hierarchy.
- W-AC-03: Provide accessibility values and hints for custom controls (e.g., gauges, progress indicators, custom pickers). Use
.accessibilityValue()and.accessibilityHint(). - W-AC-04: Respect Reduce Motion. Disable or substitute decorative animations when enabled. Use
@Environment(\.accessibilityReduceMotion). - W-AC-05: Respond to Bold Text. When the user enables Bold Text, custom text must adapt. SwiftUI dynamic type handles this automatically; custom-drawn text must check
@Environment(\.legibilityWeight). - W-AC-06: Respond to Increase Contrast. When the user enables Increase Contrast, custom colors must provide higher-contrast variants. Use
@Environment(\.colorSchemeContrast)to detect the user's preference.
Correct:
Button(action: startWorkout) {
Image(systemName: "play.fill")
}
.accessibilityLabel("Start workout")Incorrect:
Button(action: startWorkout) {
Image(systemName: "play.fill")
}
// VoiceOver reads "play" — not clear what action this performsAnti-Patterns
- Image-only buttons with no accessibility label
- Custom controls with no accessibility value or hint
- Animations that do not respect Reduce Motion
- Hiding content from the accessibility tree that sighted users can see
---
Evaluation Checklist
Use this checklist when reviewing a watchOS design or implementation.
Glanceability
- [ ] Can the user understand the primary content within 2 seconds?
- [ ] Is the most important information visible without scrolling?
- [ ] Is body text at least 16pt with sufficient contrast?
- [ ] Are interactions completable in under 5 seconds?
Digital Crown
- [ ] Does the Crown scroll vertical content?
- [ ] Do value pickers provide haptic detents?
- [ ] Are there no conflicts with system Crown behaviors?
Navigation
- [ ] Is the primary action reachable within 1 tap from launch?
- [ ] Is the navigation hierarchy 3 levels or fewer?
- [ ] Does every pushed view have a back button?
- [ ] Are top-level sections organized in a TabView (if applicable)?
Complications
- [ ] Are multiple complication families supported?
- [ ] Do complications work in both tinted and full-color modes?
- [ ] Is complication data updated via TimelineProvider?
- [ ] Does tapping a complication open relevant context?
Always On
- [ ] Is sensitive data hidden in the dimmed state?
- [ ] Is visual complexity reduced when inactive?
- [ ] Is the update frequency limited to once per minute or less?
- [ ] Is the transition between active and dimmed seamless (no layout shift)?
Workouts
- [ ] Are live metrics displayed in large, high-contrast text?
- [ ] Are haptics used for milestones?
- [ ] Is auto-pause supported for applicable workout types?
- [ ] Is the workout summary accessible with a single action?
Notifications
- [ ] Is the Short Look meaningful (title + icon)?
- [ ] Does the Long Look include inline actions?
- [ ] Are haptic types matched to notification urgency?
- [ ] Is notification frequency appropriate (not excessive)?
Accessibility
- [ ] All interactive elements have meaningful accessibility labels (no raw SF Symbol names)
- [ ] Custom controls provide accessibility values and hints via
.accessibilityValue()/.accessibilityHint() - [ ] VoiceOver can navigate all app content — no essential content hidden from the accessibility tree
- [ ] Animations respect Reduce Motion (
@Environment(\.accessibilityReduceMotion)) - [ ] Bold Text preference is respected (SwiftUI handles automatically; custom text checks
@Environment(\.legibilityWeight)) - [ ] Increase Contrast preference is respected (custom colors provide higher-contrast variants)
---
Credits & Attribution
This skill is based on the excellent work by [ehmo](https://github.com/ehmo/platform-design-skills).
Original repository: https://github.com/ehmo/platform-design-skills
Special thanks to ehmo for their generous open-source contributions, which helped shape this skill collection. Adapted by webconsulting.at for this skill collection
watchOS Design Guidelines
Purpose
This skill provides Apple Human Interface Guidelines for Apple Watch. Load it when working on watchOS apps, complications, workout features, or any wrist-based interaction design.
When to Use
- Building or reviewing watchOS app interfaces
- Designing complications for watch faces
- Implementing Digital Crown interactions
- Creating workout or health tracking features
- Designing notifications for Apple Watch
- Evaluating glanceability of Watch UI
- Working with Always On display states
File Structure
| File | Contents |
|---|---|
SKILL.md | Complete design rules, specifications, and evaluation checklist |
rules/_sections.md | All rules organized by category with IDs for cross-reference |
metadata.json | Version, references, and abstract |
Key Principles
1. Glanceable first -- every screen must communicate its purpose within 2 seconds 2. Respect the wrist -- interactions should be brief; avoid complex multi-step flows 3. Digital Crown is primary -- scroll, select, and adjust values with the Crown 4. Complications drive engagement -- keep watch face data fresh and useful 5. Always On awareness -- dim gracefully, hide sensitive content
Rule Categories
| # | Category | Priority |
|---|---|---|
| 1 | Glanceable Design | CRITICAL |
| 2 | Digital Crown | HIGH |
| 3 | Navigation | HIGH |
| 4 | Complications | HIGH |
| 5 | Always On Display | MEDIUM |
| 6 | Workouts & Health | MEDIUM |
| 7 | Notifications | MEDIUM |
| 8 | Accessibility | CRITICAL |
Priority Reference
| Level | Meaning |
|---|---|
| CRITICAL | Glanceable design, accessibility -- violations make the app unusable on Watch |
| HIGH | Digital Crown, navigation, complications -- core Watch interaction patterns |
| MEDIUM | Always On, workouts, notifications -- important but context-dependent |
Never Do
- Never place primary information off-screen (requires scrolling to see)
- Never ignore the Digital Crown for scrollable or value-picking content
- Never override system Crown behaviors (volume, Time Travel)
- Never support only one complication family
- Never use deprecated ClockKit APIs -- use WidgetKit complication families
- Never show sensitive health data in the Always On dimmed state
- Never omit accessibility labels on image-only interactive elements
- Never use laggy or batched responses to Crown rotation
{
"version": "1.0.0",
"organization": "Platform Design Skills",
"date": "February 2026",
"abstract": "Apple Human Interface Guidelines for Apple Watch. 40+ rules across 8 categories covering glanceable interfaces, Digital Crown, complications, Always On display, workout tracking, wrist-optimized interactions, and accessibility.",
"references": [
"https://developer.apple.com/design/human-interface-guidelines",
"https://developer.apple.com/design/human-interface-guidelines/designing-for-watchos",
"https://developer.apple.com/documentation/watchkit",
"https://developer.apple.com/documentation/widgetkit"
]
}
watchOS Design Rules -- Section Index
All rules organized by category with stable IDs for cross-referencing.
---
Section 1: Glanceable Design [CRITICAL]
| ID | Rule | Priority |
|---|---|---|
| W-GL-01 | Primary info visible without scrolling | CRITICAL |
| W-GL-02 | Target 5-second interaction sessions | CRITICAL |
| W-GL-03 | Large, high-contrast text (min 16pt body, 18pt+ titles) | CRITICAL |
| W-GL-04 | Minimize text; use SF Symbols over labels | CRITICAL |
| W-GL-05 | Respect wrist-down (inactive) state | CRITICAL |
| W-GL-06 | One primary data point per screen; clear visual hierarchy | CRITICAL |
Rationale: The wrist is the most constrained display surface. Users raise their wrist for a glance, not a reading session. Every pixel must justify its presence.
---
Section 2: Digital Crown [HIGH]
| ID | Rule | Priority |
|---|---|---|
| W-DC-01 | Crown is primary scroll input for vertical content | HIGH |
| W-DC-02 | Bind Crown to value pickers with haptic detents | HIGH |
| W-DC-03 | Never override system Crown behaviors | HIGH |
| W-DC-04 | Visual feedback must be frame-synced to Crown rotation | HIGH |
| W-DC-05 | Update values and highlights on each Crown increment | HIGH |
Rationale: The Digital Crown is a precision input unique to Apple Watch. It enables interaction without obscuring the small display with fingers, but only if response stays causally linked to each detent.
---
Section 3: Navigation [HIGH]
| ID | Rule | Priority |
|---|---|---|
| W-NV-01 | Default to vertical page scrolling | HIGH |
| W-NV-02 | TabView for top-level sections (max 5 tabs) | HIGH |
| W-NV-03 | NavigationStack for hierarchy (max 2-3 levels deep) | HIGH |
| W-NV-04 | Reserve modals for focused single-purpose tasks | HIGH |
| W-NV-05 | Primary action reachable within 1 tap from launch | HIGH |
Rationale: Users do not explore on a Watch. They arrive with intent and must reach their goal immediately. Deep hierarchies create frustration on a small screen.
---
Section 4: Complications [HIGH]
| ID | Rule | Priority |
|---|---|---|
| W-CP-01 | Support multiple complication families | HIGH |
| W-CP-02 | Provide tinted and full-color variants | HIGH |
| W-CP-03 | Update via TimelineProvider; keep data fresh | HIGH |
| W-CP-04 | Content meaningful without context (include units/labels) | HIGH |
| W-CP-05 | Tap launches app to relevant context | HIGH |
API Note: Complications are built with WidgetKit (watchOS 9+). Use accessoryCircular, accessoryCorner, accessoryRectangular, and accessoryInline widget families. ClockKit is deprecated.
Rationale: Complications are the primary engagement surface. A well-designed complication delivers value without the user ever launching the app.
---
Section 5: Always On Display [MEDIUM]
| ID | Rule | Priority |
|---|---|---|
| W-AO-01 | Reduce visual complexity in dimmed state | MEDIUM |
| W-AO-02 | Hide sensitive/private data when inactive | MEDIUM |
| W-AO-03 | Limit updates to once per minute in Always On | MEDIUM |
| W-AO-04 | Use system dimming behaviors (no custom dimming) | MEDIUM |
| W-AO-05 | Seamless transition between active and dimmed (no layout shift) | MEDIUM |
Rationale: Always On extends the watch face into apps. Poor Always On implementation drains battery and may expose private information.
---
Section 6: Workouts & Health [MEDIUM]
| ID | Rule | Priority |
|---|---|---|
| W-WK-01 | Large, high-contrast live metrics during workouts | MEDIUM |
| W-WK-02 | Haptic feedback for milestones and zone changes | MEDIUM |
| W-WK-03 | Auto-pause for running/walking workouts | MEDIUM |
| W-WK-04 | WaterLock during swimming workouts | MEDIUM |
| W-WK-05 | Clear summary screen; save/discard in one action | MEDIUM |
Rationale: Workout apps run during physical exertion. The user cannot stop to carefully read or perform complex interactions. Design for motion and sweat.
---
Section 7: Notifications [MEDIUM]
| ID | Rule | Priority |
|---|---|---|
| W-NT-01 | Short Look: title + app icon only | MEDIUM |
| W-NT-02 | Long Look: full content + up to 4 action buttons | MEDIUM |
| W-NT-03 | Match haptic type to notification urgency | MEDIUM |
| W-NT-04 | Do not over-notify; batch non-urgent updates | MEDIUM |
Rationale: Every Watch notification buzzes the user's wrist. Excessive or poorly designed notifications train users to ignore or disable them entirely.
---
Section 8: Accessibility [CRITICAL]
| ID | Rule | Priority |
|---|---|---|
| W-AC-01 | Accessibility label on every interactive element | CRITICAL |
| W-AC-02 | VoiceOver can navigate all app content | CRITICAL |
| W-AC-03 | Custom controls have accessibilityValue and accessibilityHint | HIGH |
| W-AC-04 | Respect Reduce Motion; disable decorative animations | HIGH |
| W-AC-05 | Respond to Bold Text; adapt custom text via @Environment(\.legibilityWeight) | HIGH |
| W-AC-06 | Respond to Increase Contrast; provide higher-contrast variants via colorSchemeContrast | HIGH |
Rationale: VoiceOver is used on Apple Watch. Complications and health data must be accessible to all users.
---
Cross-Reference: Rule Count Summary
| Section | Count | Priority |
|---|---|---|
| Glanceable Design | 6 | CRITICAL |
| Digital Crown | 5 | HIGH |
| Navigation | 5 | HIGH |
| Complications | 5 | HIGH |
| Always On Display | 5 | MEDIUM |
| Workouts & Health | 5 | MEDIUM |
| Notifications | 4 | MEDIUM |
| Accessibility | 6 | CRITICAL |
| Total | 41 |