Widgets for all your agents.
A reusable Apple-platform companion app and Cloudflare Worker backend that gives Claude, ChatGPT, automations, and software you build a native output channel through widgets, Live Activities, the Dynamic Island, and Apple TV dashboards.
The server never sends UI — only structured state conforming to a small set of templates. The Apple apps render that state through predefined SwiftUI views.
Publish directly from a conversation with no integration code. Add this URL as a custom connector:
https://api.00widget.com/mcp
The host will ask you to sign in with the Apple ID you use in the 00Widget app; approving mints an API token scoped to your account. For clients configured from a file rather than a URL, /mcp.json is the same thing in config form.
If you're inside another repo (a CI pipeline, a home-automation script, a server-side agent) and want Claude Code / Codex to publish state here, paste this into the agent — it's self-contained:
Integrate this project with 00Widget so its state shows up on iOS widgets and Live Activities.
Read the integration contract: https://api.00widget.com/llms.md
That single document is everything you need — don't pull in the rest of the 00Widget repo.
Operator-supplied env vars:
00WIDGET_BASE_URL=https://api.00widget.com
00WIDGET_API_KEY=<bearer token>
Verify both work with `curl $00WIDGET_BASE_URL/health` and an authenticated `GET /v1/cards` before writing any code.
Then:
1. Identify the surfaces in this project that an iOS widget should reflect (status, build state, queue depth, in-progress jobs, etc.).
2. For each, pick a template (`summary`, `progress`, `list`, or `action`) per llms.md's decision matrix.
3. Add the smallest possible publish path — a single function that POSTs to /v1/cards/upsert with a stable `id`. No SDK, no class hierarchy.
4. If something is time-bounded with a clear end (a build, a charge cycle, a delivery), use a Live Activity instead of a card.
Constraints:
- Use a stable `id` per logical thing — never embed timestamps or run ids.
- Never put secrets or PII in card fields. They render on the Lock Screen.
- Always end Live Activities. Never make destructive actions auto-run from widgets.
- Don't publish more than ~once a minute per card unless the value actually changed.
If this project is itself a Cloudflare Worker, see the "Notes for Cloudflare Workers callers" section in llms.md — same-account integrations should use a Service Binding instead of a public HTTPS fetch.
The API contract is also available at /llms.md.
GET /health — health check, no auth.POST /v1/cards/upsert — publish a dashboard card.GET /v1/cards — list cards for the API token.POST /v1/live-activities/start / update / end — Live Activity lifecycle.POST /v1/actions/:id/run — run an action by id.All /v1/* endpoints require Authorization: Bearer <api-token>. Tokens are issued from the operator's /admin dashboard.