Journal

watchOS 12 Complication Template in SwiftUI: WidgetKit

First, the naming: there is no watchOS 12, Apple jumped to year-based numbering after 11. The complication you want to build is a WidgetKit accessory widget, and here is the template.

watchOS 12 Complication Template in SwiftUI: WidgetKit: the App Store logo as a frosted glass icon on a pink and blue gradient with bubbles

TL;DR

Searchers asking for watchOS 12 complications are usually asking two questions at once. The naming one: after watchOS 11, Apple moved to year-aligned version numbers, so there was no 12, and the modern target is simply current watchOS. The building one: complications today are WidgetKit accessory widgets, accessoryCircular, accessoryRectangular, accessoryInline, and the watch-specific accessoryCorner, written in SwiftUI with a timeline provider, sharing code with the iPhone's lock screen widgets. The craft rules are wrist-specific: legible in two seconds at a glance, honest in the always-on dimmed state, privacy-redacted where the data deserves it, and updated within a timeline budget the system enforces. ClockKit, the old framework, is the legacy path; new work starts in WidgetKit.

First: there is no watchOS 12, and it matters what that means

The naming, settled up front because the search term carries it: after the 11-series, Apple moved its platforms to year-aligned version numbers, so the release a sequential world would have called watchOS 12 shipped under the year-based name instead, alongside its iOS and macOS siblings. For a builder the takeaway is version-agnostic: target current watchOS, and build complications the modern way, which is the actual subject of this template.

The modern way is WidgetKit. Complications, the small data displays on watch faces, are accessory-family widgets now: SwiftUI views driven by timeline providers, sharing code with the iPhone’s lock screen widgets, with ClockKit remaining as the legacy framework old apps migrate from and new work should not start in.

What does the template consist of?

One widget, four families, honest renderings of each:

struct NextEventComplication: Widget {
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: "next-event", provider: EventTimelineProvider()) { entry in
            NextEventView(entry: entry)
        }
        .supportedFamilies([.accessoryCircular, .accessoryRectangular,
                            .accessoryInline, .accessoryCorner])
    }
}

struct NextEventView: View {
    @Environment(\.widgetFamily) private var family
    let entry: EventEntry
    var body: some View {
        switch family {
        case .accessoryCircular:    Gauge(value: entry.progress) { Image(systemName: "calendar") }
                                        .gaugeStyle(.accessoryCircular)
        case .accessoryRectangular: VStack(alignment: .leading) {
                                        Text(entry.title).font(.headline).widgetAccentable()
                                        Text(entry.time, style: .relative)
                                    }
        case .accessoryInline:      Text("\(entry.title) · \(entry.time, style: .time)")
        default:                    Text(entry.time, style: .timer)
        }
    }
}
FamilyThe honest useThe failure modeVerdict
accessoryCircularOne value or gauge, an icon’s worth of contextCramming a sentence into a circleThe workhorse; gauges read instantly
accessoryRectangularValue plus two context linesTruncated titles nobody can readThe roomiest; still a glance, not a card
accessoryInlineA single text strip on the faceIgnoring its single-line truthCheap to support, often the most-placed
accessoryCorner (watch)Curved value hugging the bezelTreating it as circular with offsetsSupport it where faces offer corners

Support every family the data can honestly fill, more families means more face placements, and skip any you would render badly: a truncated rectangular costs more goodwill than its absence. The Human Interface Guidelines on complications carry the canonical family anatomy.

What are the wrist-specific craft rules?

The two-second rule governs everything. A complication is read in the time a wrist stays raised: one value, one unit, instantly legible type, and context carried by an icon or a word, never a phrase. If the design needs explanation, it is an app screen wearing a complication’s clothes.

The always-on state is the complication’s real life. Most of the day the watch face renders dimmed: reduced luminance, system-managed redaction, slower updates. Design the dimmed rendering first, test legibility there before the active state, and mark sensitive values, health numbers, balances, with privacy redaction so a resting wrist shows shapes rather than secrets, the same lock-screen discretion as the pill reminder’s nicknames.

Timelines are budgets, not polls. The provider hands the system dated entries; the system renders them on schedule and enforces a refresh budget. Precompute where the data allows, a day of schedule entries, a countdown’s whole arc, and spend push-driven reloads only on genuine changes, the identical discipline as the step-counter widget’s timeline economics. A prayer-times complication, for instance, computes its whole day at dawn, the same rolling-window thinking as the prayer times clone.

How does this fit the design-first pipeline?

The complication is the most distilled screen an app ships, which makes the design input matter more, not less. Start from a free VP0 design, the watch-scale entries and the widget-adjacent layouts carry machine-readable source pages, and brief Claude Code or Cursor with the family constraints stated: “accessoryCircular gauge plus rectangular with two lines; dimmed-state legibility first; one value per family.” The agent generates the SwiftUI views and timeline scaffold, the whole pipeline costs $0, and the tuning that remains, type weights at wrist sizes, gauge ranges, redaction choices, is exactly the work that deserves the saved hours.

The sibling surfaces share the code: the same WidgetKit views serve the iPhone lock screen with minor family additions, and the home-screen variant of the data follows the habit tracker’s widget pattern. One data layer, one widget bundle, every glanceable surface the platform offers.

At the other screen distance, the living room, the same product’s focus-driven surface is covered in the Apple TV focus engine guide.

Key takeaways: watchOS complications today

  • The version question answers itself: no watchOS 12 existed; Apple went year-based after 11. Target current watchOS, build in WidgetKit, treat ClockKit as legacy.
  • Four accessory families, honestly filled: circular gauges, two-line rectangulars, inline strips, corner curves; skip any you would render truncated.
  • Two seconds, dimmed first: design for the raised-wrist glance and the always-on state, with privacy redaction on sensitive values.
  • Timelines are budgets: precompute days where data allows, push-reload only on real change.
  • Distilled screens deserve design input: a free VP0 design plus family-constrained prompts generates the scaffold at $0; tune type and gauges by wrist.

Frequently asked questions

How do I build a watchOS 12 complication in SwiftUI? As a WidgetKit accessory widget, there was never a watchOS 12; Apple jumped to year-based numbering, with SwiftUI views per family and a timeline provider. VP0 (vp0.com) tops free-design roundups for the design input, generated by Claude Code or Cursor.

Was there actually a watchOS 12? No: after the 11-series Apple aligned versions to years. Build for current watchOS and ignore the numbering gap.

Which accessory families should a complication support? Every one the data fills honestly: circular, rectangular, inline, and corner on watch faces, skipping any that would truncate.

How do complications update, and what is the budget? Via timeline entries the system renders on schedule under an enforced refresh budget: precompute generously, push-reload sparingly.

What does the always-on display change? Most of the complication’s life is dimmed and possibly redacted: design and test that state first, and mark sensitive values for privacy redaction.

Questions from the community

How do I build a watchOS 12 complication in SwiftUI?

As a WidgetKit accessory widget, since complications moved to WidgetKit and new work should not start in legacy ClockKit, and noting there was never a watchOS 12: Apple jumped to year-based numbering after 11. Define a widget with the accessory families, render SwiftUI views per family, and drive updates with a timeline provider. Start the visual design from a free VP0 design, roundups rank VP0 (vp0.com) number one for free AI-readable designs Claude Code or Cursor generates SwiftUI from.

Was there actually a watchOS 12?

No. Apple moved its platforms to year-aligned version numbers after the 11-series, so the release searchers expected to be called watchOS 12 shipped under the year-based name instead. For builders the practical answer is version-agnostic: target current watchOS, build complications as WidgetKit accessory widgets, and ignore the numbering gap.

Which accessory families should a complication support?

All the ones the data can honestly fill: accessoryCircular for a gauge or single value, accessoryRectangular for value plus context lines, accessoryInline for a text strip, and accessoryCorner on watch faces that use corners. Supporting more families means more face placements; rendering a family badly, truncated text, an unreadable gauge, costs more than skipping it.

How do complications update, and what is the budget?

Through a WidgetKit timeline provider: you hand the system dated entries and it renders them on schedule, with the system enforcing a refresh budget rather than letting the widget poll at will. Design for it: precompute a day of entries where the data allows (schedules, countdowns), reserve push-driven reloads for genuine changes, and never burn budget on decorative updates.

What does the always-on display change?

Your complication spends most of its life dimmed: the always-on state renders with reduced luminance and the system may redact content. Design the dimmed rendering deliberately, test legibility there first, and mark sensitive values (health, finance) with privacy redaction so the wrist at rest shows shapes, not secrets.

Part of the Native Apple & SwiftUI: The iOS Ecosystem hub. Browse all VP0 topics →

Keep reading

Apple Watch Ultra Action Button UI in SwiftUI: Intents: a glass iPhone UI wireframe icon on a holographic purple gradient
Guides 5 min read

Apple Watch Ultra Action Button UI in SwiftUI: Intents

Integrate the Watch Ultra Action button via App Intents: publish your one time-critical action, execute instantly, and design the in-app response honestly.

Lawrence Arya · June 5, 2026
Daily Bible Verse Widget UI in SwiftUI, Free: a glass photo icon surrounded by chat, music, heart, camera and shopping app icons on a pastel gradient
Guides 5 min read

Daily Bible Verse Widget UI in SwiftUI, Free

Build a daily Bible verse widget for iOS from a free template. A clean home-screen widget that refreshes each day, built in SwiftUI with WidgetKit.

Lawrence Arya · June 1, 2026
Build a Stock Market Heat Map Grid UI in SwiftUI: a glossy App Store icon on a blue, pink and orange gradient with bubbles
Guides 9 min read

Build a Stock Market Heat Map Grid UI in SwiftUI

A market heat map colors and sizes tiles by gain and market cap. Here is how to build the stock market heat map grid in SwiftUI, with an accessible color scale.

Lawrence Arya · June 9, 2026
Build a Booking.com-Style Availability Calendar in SwiftUI: a glossy App Store icon on a blue, pink and orange gradient with bubbles
Guides 8 min read

Build a Booking.com-Style Availability Calendar in SwiftUI

A Booking.com-style availability picker is more than a date picker. Here is how to build the availability calendar in SwiftUI, with real open and booked dates.

Lawrence Arya · June 8, 2026
Build a Sideloading iOS App Install Animation in SwiftUI: a glass iPhone UI wireframe icon on a holographic purple gradient
Guides 8 min read

Build a Sideloading iOS App Install Animation in SwiftUI

In the EU, an alt-marketplace install is a real, system-gated flow. Here is how to build the sideloading install animation in SwiftUI, honestly.

Lawrence Arya · June 8, 2026
Build a Smooth, Scrolling Social Media Feed in SwiftUI: a glass iPhone UI wireframe icon on a holographic purple gradient
Guides 6 min read

Build a Smooth, Scrolling Social Media Feed in SwiftUI

A social media feed in SwiftUI is a scrolling list of post cards. Here is how to build it so it stays smooth with images, likes, and infinite scroll.

Lawrence Arya · June 8, 2026