Wear OS Specialist
Scope
Use this skill when implementing, reviewing, or debugging Wear OS apps. Optimize for:
- Fast, glanceable UI on small screens
- Battery-aware behavior and background limits
- Lifecycle correctness (navigation/back behavior, resumability, ambient/AOD where relevant)
- Modern Android stack: Kotlin + coroutines/Flow, Compose for Wear OS, MVVM-ish state holders, Room/DataStore, Navigation, and watch-specific surfaces (Tiles/Complications)
Operating principles (Wear OS)
- Glanceability first: show the primary metric/action clearly; remove secondary UI.
- Big tap targets: prefer few large buttons over dense controls.
- Minimize work per frame: avoid heavy computation/IO on the main thread.
- Battery-friendly: background work, sensors, timers, and haptics must be intentional and lifecycle-safe.
- Predictable state: single source of truth; restore correctly after process death where it matters.
Default implementation workflow (stack-first)
When adding or changing a feature, follow this path unless there’s a strong reason not to:
UI (Compose screen)
- Keep UI stateless where possible; pass state + event callbacks.
- Make the primary action the largest and easiest to hit.
- Avoid “clever” gestures; assume sweaty hands + motion.
State holder (ViewModel / state container)
- Own business rules and validation; coordinate transient effects (snack/haptics).
- Use coroutines; do not block UI.
- Expose immutable UI state (
data class) and event methods.
Data layer (Room / DataStore)
- Use Room for relational/history data; DataStore for preferences and small key-value config.
- Prefer simple, efficient queries; stream to UI via Flow when appropriate.
Navigation
- Keep routes explicit; avoid fragile stringly-typed args.
- Ensure back behavior feels natural on watch (no deep stacks).
Validation
- Define a short on-watch test plan: key flows, rapid tapping, interruptions, background/return behavior.
Wearable UX checklist (quick)
- Primary action is reachable in one tap from the screen.
- All actions are usable with one thumb (no precision).
- Defaults are sensible (don’t force setup before the core action).
- “Reference/History” info is supportive, not dominating.
- Avoid blocking flows; confirmations only for destructive actions.
Performance and recomposition rules of thumb
- Keep derived values with
remember/derivedStateOf when they’re non-trivial.
- Avoid allocating new lists/objects on every recomposition in hot UI paths.
- Prefer
Flow/StateFlow from data layer to UI rather than manual polling.
- Timer updates should be coarse (e.g., once per second) and stop when not needed.
- Be careful with formatters/parsers in composables; cache them.
Debugging workflow (watch-first)
When something is “weird on device”:
- Reproduce on the watch (not emulator) and note:
- screen, action sequence, watch state (AOD on/off), battery saver, connectivity
- Add temporary logs around:
- navigation arguments
- data reads/writes (Room/DataStore/network)
- sensors/timers start/stop and lifecycle callbacks
- Check for:
- main-thread IO
- state being recreated incorrectly (missing persistence/restoration)
- runaway coroutines/timers/sensor listeners continuing after leaving a screen
Output templates
Implementation plan template
Use this format when proposing work:
## Summary
- What user-facing behavior changes (1–3 bullets)
## Files to touch
- `...`
## Data/state changes
- UI state:
- Events:
- Persistence (Room/DataStore):
- Background work (if any):
## Wear OS constraints check
- Glanceability:
- Tap targets:
- Battery/background:
- Lifecycle/restore:
## Test plan
- On-watch manual checks (key flows + edge cases):
Review template (PR-style)
## Correctness
- [ ] State transitions are correct under rapid taps / interruptions
- [ ] Data reads/writes are correct and resilient (restart, process death)
## Wear OS UX
- [ ] Primary action is largest and easiest to hit
- [ ] No dense UI / tiny tap targets
- [ ] No blocking flows during primary usage
## Performance/battery
- [ ] No IO on main thread
- [ ] Timers/sensors stop when leaving screen
- [ ] Recomposition hotspots avoided (no per-frame allocations)
## Data layer
- [ ] Room/DataStore usage fits the problem (history vs settings)
- [ ] Queries are minimal and efficient (only load what UI needs)
Additional references (one-level deep)
- Review checklist: review-checklist.md
- Performance/battery notes: perf-battery.md
- Examples: examples.md
1---2name: wearos-specialist3description: Wear OS-focused implementation, review, and debugging guidance (Kotlin, Jetpack Compose for Wear OS, coroutines/Flow, MVVM, Room/DataStore, navigation, tiles/complications, sensors, haptics). Use when building or reviewing smartwatch apps, improving wearable UX, or addressing watch performance/battery/lifecycle issues.4---56# Wear OS Specialist78## Scope910Use this skill when implementing, reviewing, or debugging **Wear OS** apps. Optimize for:1112- **Fast, glanceable UI** on small screens13- **Battery-aware** behavior and background limits14- **Lifecycle correctness** (navigation/back behavior, resumability, ambient/AOD where relevant)15- **Modern Android stack**: Kotlin + coroutines/Flow, Compose for Wear OS, MVVM-ish state holders, Room/DataStore, Navigation, and watch-specific surfaces (Tiles/Complications)1617## Operating principles (Wear OS)1819- **Glanceability first**: show the primary metric/action clearly; remove secondary UI.20- **Big tap targets**: prefer few large buttons over dense controls.21- **Minimize work per frame**: avoid heavy computation/IO on the main thread.22- **Battery-friendly**: background work, sensors, timers, and haptics must be intentional and lifecycle-safe.23- **Predictable state**: single source of truth; restore correctly after process death where it matters.2425## Default implementation workflow (stack-first)2627When adding or changing a feature, follow this path unless there’s a strong reason not to:28291. **UI (Compose screen)**30 - Keep UI stateless where possible; pass state + event callbacks.31 - Make the primary action the largest and easiest to hit.32 - Avoid “clever” gestures; assume sweaty hands + motion.33342. **State holder (ViewModel / state container)**35 - Own business rules and validation; coordinate transient effects (snack/haptics).36 - Use coroutines; do not block UI.37 - Expose immutable UI state (`data class`) and event methods.38393. **Data layer (Room / DataStore)**40 - Use Room for relational/history data; DataStore for preferences and small key-value config.41 - Prefer simple, efficient queries; stream to UI via Flow when appropriate.42434. **Navigation**44 - Keep routes explicit; avoid fragile stringly-typed args.45 - Ensure back behavior feels natural on watch (no deep stacks).46475. **Validation**48 - Define a short on-watch test plan: key flows, rapid tapping, interruptions, background/return behavior.4950## Wearable UX checklist (quick)5152- Primary action is reachable in **one tap** from the screen.53- All actions are usable with **one thumb** (no precision).54- Defaults are sensible (don’t force setup before the core action).55- “Reference/History” info is supportive, not dominating.56- Avoid blocking flows; confirmations only for destructive actions.5758## Performance and recomposition rules of thumb5960- Keep derived values with `remember`/`derivedStateOf` when they’re non-trivial.61- Avoid allocating new lists/objects on every recomposition in hot UI paths.62- Prefer `Flow`/`StateFlow` from data layer to UI rather than manual polling.63- Timer updates should be **coarse** (e.g., once per second) and stop when not needed.64- Be careful with formatters/parsers in composables; cache them.6566## Debugging workflow (watch-first)6768When something is “weird on device”:6970- Reproduce on the watch (not emulator) and note:71 - screen, action sequence, watch state (AOD on/off), battery saver, connectivity72- Add temporary logs around:73 - navigation arguments74 - data reads/writes (Room/DataStore/network)75 - sensors/timers start/stop and lifecycle callbacks76- Check for:77 - main-thread IO78 - state being recreated incorrectly (missing persistence/restoration)79 - runaway coroutines/timers/sensor listeners continuing after leaving a screen8081## Output templates8283### Implementation plan template8485Use this format when proposing work:8687```markdown88## Summary89- What user-facing behavior changes (1–3 bullets)9091## Files to touch92- `...`9394## Data/state changes95- UI state:96- Events:97- Persistence (Room/DataStore):98- Background work (if any):99100## Wear OS constraints check101- Glanceability:102- Tap targets:103- Battery/background:104- Lifecycle/restore:105106## Test plan107- On-watch manual checks (key flows + edge cases):108```109110### Review template (PR-style)111112```markdown113## Correctness114- [ ] State transitions are correct under rapid taps / interruptions115- [ ] Data reads/writes are correct and resilient (restart, process death)116117## Wear OS UX118- [ ] Primary action is largest and easiest to hit119- [ ] No dense UI / tiny tap targets120- [ ] No blocking flows during primary usage121122## Performance/battery123- [ ] No IO on main thread124- [ ] Timers/sensors stop when leaving screen125- [ ] Recomposition hotspots avoided (no per-frame allocations)126127## Data layer128- [ ] Room/DataStore usage fits the problem (history vs settings)129- [ ] Queries are minimal and efficient (only load what UI needs)130```131132## Additional references (one-level deep)133134- Review checklist: [review-checklist.md](review-checklist.md)135- Performance/battery notes: [perf-battery.md](perf-battery.md)136- Examples: [examples.md](examples.md)137