home / skills / tomkrikorian / visionosagents / visionos-widgetkit-developer

visionos-widgetkit-developer skill

/skills/visionos-widgetkit-developer

This skill helps you design, implement, and troublehoot visionOS WidgetKit widgets with mounting styles, textures, and LevelOfDetail aware layouts.

npx playbooks add skill tomkrikorian/visionosagents --skill visionos-widgetkit-developer

Review the files below or copy the command above to add this skill to your agents.

Files (6)
SKILL.md
5.7 KB
---
name: visionos-widgetkit-developer
description: Build and debug WidgetKit widgets for Apple Vision Pro (visionOS), including mounting styles (elevated/recessed), textures (glass/paper), proximity-aware layouts via LevelOfDetail, and timeline update troubleshooting.
---

# visionOS WidgetKit Developer

## Description and Goals

This skill helps you design, implement, and troubleshoot **WidgetKit widgets for Apple Vision Pro**. On visionOS, widgets are spatial objects that people pin to real surfaces, and they can be viewed from different distances. visionOS adds widget-specific capabilities like **mounting styles** (elevated vs recessed), **textures** (glass vs paper), and **proximity-aware layouts** via `LevelOfDetail`.

### Goals

- Help you choose the right widget strategy for Vision Pro (visionOS app vs compatibility widgets).
- Implement visionOS-specific widget presentation: mounting styles, textures, and families.
- Ensure glanceability at distance using `LevelOfDetail`-driven layouts.
- Provide a practical debugging checklist for timelines, refreshes, and rendering issues.

## What This Skill Should Do

When you ask to build or debug a Vision Pro widget, this skill should:

1. **Clarify scope and platform**: Is this a visionOS app widget, or an iOS/iPadOS widget running on Vision Pro in compatibility mode? Which widget families must be supported?
2. **Choose layout strategy**: Define a “default” layout (close) and a “simplified” layout (far) using `@Environment(\.levelOfDetail)`.
3. **Configure visionOS widget presentation**:
   - Set `supportedMountingStyles` (elevated/recessed) appropriately.
   - Choose `widgetTexture` (glass/paper) where available/appropriate.
4. **Validate legibility and content density**: Ensure the simplified layout remains readable from across the room.
5. **Handle updates**: Implement a sound timeline strategy and define when/how the widget reloads.
6. **Debug and iterate**: Provide concrete checks for common failure modes (missing families, bad Info.plist, broken layouts in recessed mode, stale timelines).

Load the most relevant reference file(s) below based on the specific issue.

## Information About the Skill

### Core Concepts

#### Widgets in visionOS are spatial objects

On Vision Pro, widgets are pinned to horizontal or vertical surfaces and behave like physical objects in the room. This changes how you design for legibility, contrast, and layout compared to 2D-only platforms.

#### Mounting styles: elevated vs recessed

On vertical surfaces, a widget can appear **recessed** (embedded into a wall) or **elevated** (sitting on top of the surface). Some widget designs only make sense in one mode.

#### Textures: glass vs paper

For widgets your visionOS app offers, you can typically choose a **glass** or **paper** texture. This affects background treatment, contrast, and how “poster-like” your widget feels.

#### Proximity awareness with `LevelOfDetail`

visionOS can change a widget’s `LevelOfDetail` based on **user proximity**. Treat this as a first-class requirement:

- `.default`: more information, smaller typography, richer layout.
- `.simplified`: less information, larger typography, fewer elements, more contrast.

#### Family support differences for extra-large widgets

visionOS supports system widget families including extra-large, but the correct family to declare depends on whether your widget is part of a visionOS app vs a compatible iOS/iPadOS app.

### Reference Tables

| Reference | When to Use |
|---|---|
| [`REFERENCE.md`](references/REFERENCE.md) | Overview, decision points, and a quick checklist for Vision Pro widgets. |
| [`mounting-styles.md`](references/mounting-styles.md) | When deciding elevated vs recessed support and avoiding layout breakage. |
| [`textures-and-rendering.md`](references/textures-and-rendering.md) | When choosing glass vs paper, and ensuring legibility in different render modes. |
| [`proximity-levelofdetail.md`](references/proximity-levelofdetail.md) | When implementing near/far layouts using `LevelOfDetail`. |
| [`debugging-and-updates.md`](references/debugging-and-updates.md) | When widgets don’t refresh, don’t appear, or appear stale/broken. |

### Implementation Patterns

#### Configure a visionOS widget with mounting + texture

```swift
import SwiftUI
import WidgetKit

struct MyVisionOSWidget: Widget {
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: "MyVisionOSWidget", provider: Provider()) { entry in
            MyWidgetView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("Glanceable info in your space.")
        .supportedMountingStyles([.elevated, .recessed])
        .widgetTexture(.glass)
        // Choose families intentionally; see references for Vision Pro rules.
        .supportedFamilies([.systemSmall, .systemMedium, .systemLarge])
    }
}
```

#### Proximity-aware widget layout

```swift
import SwiftUI
import WidgetKit

struct MyWidgetView: View {
    @Environment(\.levelOfDetail) private var levelOfDetail
    let entry: Provider.Entry

    var body: some View {
        if levelOfDetail == .simplified {
            SimplifiedView(entry: entry)
        } else {
            DetailedView(entry: entry)
        }
    }
}
```

### Pitfalls and Checks

- Don’t ship a single dense layout: always consider `.simplified` for distance readability.
- Don’t assume recessed mode “just works”: test layouts and backgrounds in recessed mounting.
- Avoid tiny typography and low-contrast UI; pinned widgets are often viewed from far away.
- Don’t forget to include the right widget families (especially extra-large differences).
- If timelines seem stale, confirm your timeline policy and reload strategy.

Overview

This skill helps you design, implement, and troubleshoot WidgetKit widgets for Apple Vision Pro (visionOS). It focuses on visionOS specifics: mounting styles (elevated vs recessed), textures (glass vs paper), proximity-aware layouts using LevelOfDetail, and timeline/update debugging. You get a practical checklist and concrete implementation patterns to ensure legibility and correct behavior when widgets are pinned in 3D space. The guidance also clarifies when to target a visionOS-native widget versus a compatibility widget from iPhone/iPad builds.

How this skill works

When asked to build or debug a Vision Pro widget, the skill first clarifies scope (native visionOS widget vs compatibility mode) and required families. It then maps a two-tier layout strategy: a default (close) layout and a simplified (far) layout driven by @Environment(\.levelOfDetail). It recommends mounting styles and textures, validates legibility/density trade-offs, and provides a timeline and refresh checklist to diagnose stale or missing updates. Finally, it lists concrete checks for common failure modes and offers implementation code patterns to follow.

When to use it

  • Designing a widget specifically for Apple Vision Pro with spatial considerations
  • Converting existing iOS/iPadOS widgets to work well when pinned in visionOS
  • Implementing proximity-aware layouts using LevelOfDetail for near/far readability
  • Choosing mounting styles and textures to match your app’s visual language
  • Troubleshooting stale timelines, missing families, or rendering differences in recessed mode

Best practices

  • Define two layouts: a detailed default and a simplified far view using @Environment(\.levelOfDetail)
  • Explicitly declare supportedMountingStyles and test both elevated and recessed modes
  • Pick widgetTexture (glass or paper) to match contrast needs and test in multiple lighting conditions
  • Favor larger typography and reduced content density for .simplified to maintain glanceability from distance
  • Use a deliberate timeline policy and implement reloads/refresh logic; add diagnostics for stale entries

Example use cases

  • Create a visionOS-native weather widget with glass texture for high-contrast glanceability across a room
  • Adapt an iPhone widget to be compatibility-friendly while adding a simplified layout for distance
  • Debug a widget that appears broken in recessed mounting by checking safe area, background blending, and supported families
  • Resolve stale content by auditing timeline policy, background refresh settings, and provider code

FAQ

Do I always need both elevated and recessed support?

Not always; choose based on design intent. If your layout relies on visible edges or shadows, support elevated. If it must blend into a wall, support recessed and test backgrounds.

How do I test proximity layouts locally?

Use the simulator and devices with Vision Pro tooling when available. Emulate LevelOfDetail states and verify typography, spacing, and contrast in both .default and .simplified modes.