A widget that shows when it's out of date
Home Screen widgets can't call APIs, can't run in the background, and can't even render glass. How I designed Ahead's widget around all three.
Ahead’s whole promise was a briefing that’s current: morning, midday and evening, each one fresh. So the obvious next step, a Home Screen widget, ran straight into everything WidgetKit won’t let you do. Widgets can’t call APIs, can’t run in the background, and can’t choose when they redraw.
The hard part wasn’t fitting a briefing into a small rectangle. It was staying honest within those limits.
Old information should look old
The briefing refreshed at 11 am and 4 pm. A widget can’t check for updates, but it can schedule when it changes, so Ahead’s widget lined up with those times. At exactly 11:00 it switched to a “midday update ready” state: the old content faded and the widget said there was a newer briefing waiting in the app.
No background work and no wasted refreshes, and the widget was always clear about how current it was. A briefing widget that shows 9 am information at 3 pm is misleading. This one knew when it was out of date and said so.
A refresh button where you can’t refresh
Widgets can’t call APIs, and I wanted a refresh button anyway. So the button sets a flag in storage the app and widget share, then turns into a green “queued” check. The next time you open the app, it sees the flag and refreshes everything.
The limit didn’t change, but the button now does something you can see, and the app follows through when you open it.
Glass doesn’t render in widgets
iOS’s glassEffect renders as nothing inside a widget. No error and no fallback, just missing UI and empty space. Every bit of “glass” in the widget is built by hand from see-through fills and thin strokes, with a comment at the top of the file so nobody brings the real API back.
That’s a big part of platform work. Half the limits are documented, and you find the other half when a screenshot comes back looking wrong.
The parts nobody sees
Underneath, the app and widget share one small snapshot of the briefing, and the app tells the widget to reload whenever it saves a new one. The icons are free 3D renders, a tea cup for morning, a sun for midday and a moon for evening, and I removed their white backgrounds by hand because they only came on white.
You won’t notice any of it, and I spent a lot of the design time there.