← Back to blog

Building widgets people actually use (WidgetKit, 2026)

WidgetKit shipped in 2020 and most apps still treat widgets like a checkbox feature. They're built once, never iterated, and silently dropped from home screens within a week. Across our catalog, widgets are some of the most-engaged surfaces - but only because we treat them as their own product. This post is about how we approach them.

Why most widgets are forgotten

The default WidgetKit tutorial produces a static widget that shows yesterday's data and updates infrequently. Users put it on their home screen, glance at it once, and remove it the next day.

The fix isn't more frequent updates - Apple's update budget guarantees you won't get more than 40-70 timeline reloads per day. The fix is to design for a single moment of use: the moment the user looks at their home screen and asks 'what's my status?'

The three-tier mental model

We size every widget into one of three tiers based on the question it answers:

  • Glance tier (small widget). Answers one number or one state. Steps today, focus minutes, current streak. Zero interaction.
  • Context tier (medium widget). Adds one supporting detail and one tap target. Pomodoro: current session + remaining time + tap to pause. Pomoly's widget is exactly this.
  • Action tier (large widget or Lock Screen). Adds two or three quick actions: log entry, start timer, mark complete. Pastin's large widget shows recent clips with a tap-to-copy.

Static vs intent configuration

If your widget changes meaning per user (different habits, different focus modes), use AppIntentConfiguration. Users get configuration directly in the widget gallery - no jumping into your app to set it up.

If your widget shows a single fixed view (today's progress), StaticConfiguration is one less moving part. Don't make it intent-based for the sake of optionality.

Update budget - staying under 40/day

Apple gives you ~40-70 reloads per day. Burning that on every minute change means your widget goes stale by 2 PM.

Our heuristic: schedule reloads at meaningful state transitions, not at fixed intervals. For a focus timer, we reload at session start, on the 5/10/15 minute marks, and at session end - not every 60 seconds. For a habit tracker, we reload at midnight (day rollover) and on user actions via WidgetCenter.shared.reloadTimelines.

Designing for glanceability

Glance design rules we follow:

  • One number, large. If your small widget shows three numbers, the user can't read any of them at arm's length.
  • Color encodes state, not decoration. Green for on-track, gray for idle, red for overdue.
  • Avoid micro-icons in the corner. They eat space and don't help.
  • Test on the actual home screen at 1m distance. Not in the simulator at 100% zoom.

Lessons we've shipped on

Simplio Daily Routines originally shipped a small widget showing all five routines. Reads were poor - too much to scan. We reduced it to 'next routine in N minutes' and engagement tripled.

BodiLog shows a 7-day trend line on the medium widget. Originally we drew it with bars; switching to a single line increased home-screen retention by ~30% based on our own removal-rate measurements.