Push any number with one HTTP request and see it on your iPhone. Everything below works with curl, Python, Home Assistant, n8n, a cron job or an AI agent. New here? The guide walks through the app first.
Decoupled by design. Easy to extend.
The server is fully generic. It stores whatever you push. Collectors are independent scripts you write and run yourself, so anyone can build one for any service.
Live in minutes. Three commands.
# Create an account and get your API keys curl -X POST https://api.widgetdash.app/api/v1/users \ -H "Content-Type: application/json" \ -d '{"name": "your-name"}'
curl -X PUT https://api.widgetdash.app/api/v1/data/my-source \ -H "Authorization: Bearer YOUR_WRITE_KEY" \ -H "Content-Type: application/json" \ -d '{ "display_name": "My Service", "icon": "chart.bar.fill", "category": "monitoring", "metrics": [ {"label": "Users Online", "value": "42", "type": "number", "color": "green"}, {"label": "Status", "value": "Healthy", "type": "status", "color": "green"} ] }'
curl https://api.widgetdash.app/api/v1/widget \
-H "Authorization: Bearer YOUR_READ_KEY"
Every endpoint, in one place.
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /api/v1/users |
None | Create account, get API keys |
| GET | /api/v1/users/me |
Read | Get account info |
| DELETE | /api/v1/users/me |
Write | Delete the account and all its data (body {"confirm":"DELETE"}) |
| POST | /api/v1/users/me/rotate-keys |
Write | Replace both API keys; the old ones stop working at once |
| PUT | /api/v1/data/{source_key} |
Write | Push data from collector |
| GET | /api/v1/widget |
Read | Get all widget data |
| GET | /api/v1/data/{source_key} |
Read | Get specific source data |
| POST | /api/v1/sources |
Write | Register data source |
| GET | /api/v1/sources |
Read | List data sources |
| DELETE | /api/v1/sources/{source_key} |
Write | Delete data source |
| GET | /health |
None | Health check |
| GET | /api/v1/version |
None | Version info |
Every metric carries a type. The type decides how the widget renders it.
A large, bold number. Use it for counts, totals, and headline figures.
A plain string. Use it for labels, names, descriptions, or any short value.
A colored badge. Ideal for health checks, states, and alerts.
A bar for values from 0-100. Great for utilization, quotas, and completion.
A moment in time, shown as how long ago it was. Send ISO 8601 (2026-10-18T05:00:00Z) or Unix seconds; the widget keeps it current between pushes. Great for last backup, last deploy, last sync.
On a Large widget, a source's metrics share rows, up to four side by side, and text in a shared row shows up to two lines. For a long value like the title of what you last watched, add "wide": true and the metric gets a full row of its own, where it is in your list (iOS app 1.8 or later). Put wide metrics last to keep the others together.
Set thresholds once and leave color out of your metrics: the server picks the color every time the widget reads. Send color_rules with any push; it's kept until you send new rules, and {} clears them. The first rule whose conditions all match wins; a rule with only a color is the default. A color sent in the push always wins.
{
"metrics": [ ... ],
"color_rules": {
"Days left": [{"below": 3, "color": "red"}, {"below": 7, "color": "yellow"}, {"color": "green"}],
"Status": [{"equals": "Down", "color": "red"}, {"color": "green"}],
"Last backup": [{"older_than": "24h", "color": "red"}, {"color": "green"}]
}
}
Conditions: below / above compare the first number in the value ("40 days", "61%", "1,284"), equals matches text (any case), older_than / newer_than check a timestamp's age (30m, 12h, 7d), so a backup turns red on its own once it's too old.
A collector is any script that pushes data to WidgetDash on a schedule.
changed_at move only when a value actually changes. No need to hash payloads or skip writes.
import httpx, os, time API_KEY = os.environ["WIDGET_API_KEY"] SERVER = "https://api.widgetdash.app" while True: # Fetch your data (replace with your own logic) users_online = get_users_count() httpx.put(f"{SERVER}/api/v1/data/my-app", headers={"Authorization": f"Bearer {API_KEY}"}, json={ "display_name": "My App", "icon": "person.3.fill", "category": "app", "metrics": [ {"label": "Online", "value": str(users_online), "type": "number", "color": "green"} ] }) time.sleep(60)
Scan a QR code and the app configures itself.
Sign up on the dashboard (or just open the iPhone app, which creates a free account) to get your read and write keys.
Open the WidgetDash app and scan the code below, or the one on your dashboard.
The settings apply at once. Your widgets start showing data right away.
Set up the app from your phone's browser in one tap.
Reading this on your iPhone? Tap the "Open in App" button next to the QR code above. The deep link passes your server URL and key straight into the WidgetDash app, so you type nothing. With your write key the app can also add, reorder and delete sources; with your read key it can only show them.
The deep link format is:
widgetdash://setup?server=https://api.widgetdash.app&key=YOUR_KEY
Your data at a glance, right on your Home Screen.
Scan the QR code on your dashboard, or enter your write key in the app (a read key connects view-only).
Long-press your Home Screen and add the WidgetDash widget in small, medium or large, or add it to your Lock Screen.