Example
Next departures
Two buses with live countdowns.
{
"v": 1,
"refresh": 300,
"accessibility": "Bus 42 to Kings Cross in 6 minutes, bus 17 to Angel in 14 minutes",
"url": "https://tfl.gov.uk",
"view": {
"type": "vstack",
"spacing": 10,
"padding": 14,
"bg": "#121319",
"children": [
{
"type": "hstack",
"spacing": 8,
"align": "center",
"children": [
{
"type": "text",
"text": "Camden Road",
"style": "caption",
"weight": "semibold",
"color": "#8E8E93"
},
{"type": "spacer"},
{
"type": "text",
"text": "Southbound",
"style": "caption",
"color": "#8E8E93"
}
]
},
{
"type": "hstack",
"spacing": 10,
"align": "center",
"children": [
{
"type": "zstack",
"align": "center",
"w": 38,
"h": 26,
"corner": 6,
"bg": "#E4322B",
"children": [
{
"type": "text",
"text": "42",
"weight": "bold",
"size": 15,
"color": "white"
}
]
},
{
"type": "text",
"text": "Kings Cross",
"style": "headline",
"color": "white"
},
{"type": "spacer"},
{
"type": "timer",
"until": "2026-08-11T08:46:00Z",
"size": 22,
"weight": "semibold",
"color": "white"
}
]
},
{"type": "divider"},
{
"type": "hstack",
"spacing": 10,
"align": "center",
"children": [
{
"type": "zstack",
"align": "center",
"w": 38,
"h": 26,
"corner": 6,
"bg": "#2B6FE4",
"children": [
{
"type": "text",
"text": "17",
"weight": "bold",
"size": 15,
"color": "white"
}
]
},
{"type": "text", "text": "Angel", "style": "headline", "color": "white"},
{"type": "spacer"},
{
"type": "timer",
"until": "2026-08-11T08:54:00Z",
"size": 22,
"weight": "semibold",
"color": "#B4B4BC"
}
]
}
]
}
} How it works
Two rows, each an hstack: route badge, destination, countdown. A spacer between the destination and the time pushes them to opposite edges, which is how you get a flush right column without knowing how wide anything is.
The countdowns are timer nodes. They keep counting on the device between refreshes, so this widget stays correct for the full fifteen minutes until its next fetch instead of going stale the moment it is drawn. That is the single most useful thing in the protocol — see timelines and refreshes.
Each route badge is the same empty-stack shape idiom as the deploy example, with a text laid over it by a zstack.
Put it on your Home Screen
This example is served live, with timestamps generated at the moment of the request. Add the URL as a hook in the app and it will work on a real phone.
https://webhookwidget.com/demo/departures Next
Server health — CPU, memory, disk, and load at a glance.
All examples