A column
A set of values. Stat averages it; a list shows its rows. The layout decides how to use it.
The data guide
Start with one connection and one widget. We’ll help you get a real value on screen, then make it your own.
For the current pre-release app. No connection required if you’d rather type your own text or numbers.
A quick orientation
A source is the Sheet or endpoint WidgetWire reads. One source can power several widgets.
Mapping connects a widget’s content slot—like Value or Caption—to a column or one cell.
Preview your design in the app, save it, then add the widget through iOS.
01 / Google Sheets
You’ll need a Google Sheet that can be read without signing in. WidgetWire reads it; it never edits your spreadsheet.
Put unique, non-empty column names in row 1 and one item per row underneath. No title rows or merged cells. Download our CSV and import it into a new Sheet using File → Import in Google Sheets on a computer.
Download example spreadsheet CSV ↓
On a phone, you can enter the small table below in the Sheets app instead. The full CSV adds Date, Status, Text and Active columns for the other recipes.
In Google Sheets, open Share → General access, choose Anyone with the link and set the role to Viewer. Copy the link and save the sharing change. On iPhone, look for Manage access if General access isn’t shown.
Download/export access must also be allowed. Work or school accounts may restrict sharing. Google’s sharing help · Import help
Open Sources, tap + (or Connect if empty), choose Google Sheets, paste the Sheet URL and tap Connect. No Google sign-in or API key is needed.
Open the saved source. Look under Columns and Data: Name, Value and Percent should appear, with Design and 20 in the first data row. Then make your first widget.
| Name | Value | Percent |
|---|---|---|
| Design | 20 | 0 |
| Build | 40 | 50 |
| Review | 60 | 100 |
| Launch 🚀 | 80 | 100 |
Use the normal docs.google.com/spreadsheets/d/…/edit link, not a “Publish to web” /d/e/…/pubhtml link. To pick a tab precisely, open that tab in a browser and copy its address including gid=….
Source details also lets you switch between discovered tabs. Check your mappings after switching: the column names must still exist. Formulas are read as their exported values, not executed inside WidgetWire.
02 / JSON endpoints
An endpoint is a web address that returns data directly—not a dashboard, a login page or an API documentation page. WidgetWire sends an HTTPS GET request to that address.
Use your service’s data URL, or host the example JSON below on an HTTPS server. Opening the URL should return JSON. Downloading a file to your phone alone does not create an endpoint.
Tap + → JSON / REST API, paste the Endpoint URL, set Authentication if needed, then tap Connect. Public endpoints need no credentials.
Open the saved source and inspect Columns and Data. With our example, you’ll see four rows and a Value column containing 20, 40, 60 and 80. Continue to your first widget.
[
{"Name":"Design","Value":20,"Percent":0},
{"Name":"Build","Value":40,"Percent":50},
{"Name":"Review","Value":60,"Percent":100},
{"Name":"Launch 🚀","Value":80,"Percent":100}
]
Download the complete example JSON ↓
The complete file includes the extra fields needed for every layout recipe. Return a successful HTTP response, ideally with Content-Type: application/json.
No server or key needed. This JSONPlaceholder example is fictional data from a third-party service, not a WidgetWire backend.
https://jsonplaceholder.typicode.com/todos/1Add this URL as JSON / REST API with no authentication. Expect one row with id, title, userId and completed. Create a Stat widget and map its Value slot to id: it should show 1, not the four-row example’s 50.
The demo is read-only sample content and may be unavailable. Replace it with your own endpoint when you’re ready.
Use the method your API provider specifies. Credentials go into Key, not into a widget’s text or template.
Authorization: Bearer ….X-API-Key, in Header and the secret in Key.api_key, in Parameter and the secret in Key.Keys are stored in the iOS Keychain; the library stores a reference. Prefer header authentication when available: query keys become part of the request URL and may appear in server logs. Use read-only, narrowly scoped credentials.
OAuth sign-in, POST bodies and automatic token renewal are not supported. Never include keys in a template, screenshot or support message.
The most predictable format is an array of flat objects. Each object is a row; its properties become columns. A single flat object, a one-level wrapper such as {"data":[{"Name":"Design","Value":20}]}, and parallel arrays also work.
Parallel arrays need at least two columns of equal length with more than one item. One nested object of parallel arrays is accepted. If several arrays of objects exist, the first non-empty one by alphabetically sorted key is used.
Deeply nested collections, pagination and JSONPath selection are not supported. Flatten fields or return a small summary from your server. Numbers stay numeric, booleans become true/false, and null or missing cells become empty text.
New JSON sources order columns alphabetically. Refreshes retain existing column order and append new fields. Bind by column name where possible, and keep names and capitalization stable.
03 / Your first connected widget
Use the four-row spreadsheet or JSON example above. The smaller public demo is different: map id there to see 1.
Open Templates, choose Home Screen and Small, then choose Stat.
In the editor’s Content tab, scroll to Data → Connect a Data Source. Select the connection under Your sources. You don’t need to paste its URL again.
Tap the Value content slot. In Map Columns, make sure the column named Value is selected. Tap it only if it isn’t already selected, then tap Done. Auto-mapping is a suggestion; check this choice.
The preview should show 50, the average of 20, 40, 60 and 80. To show one specific value instead, tap Value again, choose Pick a cell and select the cell containing 20. In the example Sheet, that is B2.
Open the phone preview and tap Save Widget. On your Home Screen, touch and hold an empty area, choose Edit → Add Widget, find WidgetWire and choose the matching size. Touch and hold the added widget, choose Edit Widget and select your saved design.
On iOS 17, use the + button at the top of the Home Screen instead of Edit → Add Widget. See Apple’s installation guide for system-specific help.
A set of values. Stat averages it; a list shows its rows. The layout decides how to use it.
Exactly one value, like a total. A1 is a header; A2 is the first data cell. JSON has its own generated grid.
Your own caption or number. In Map Columns, type a fixed value and tap Use. It won’t change with the source.
04 / Pick your next idea
These recipes use the complete downloadable CSV or JSON file, not the public demo. Read each mapping as “widget slot → source column.” Open just the layouts you need.
Value → Value. Shows the average, 50. Bind one cell if you want a specific total instead. Caption is optional.
Row label → Name; Row value → Value. Design 20, Build 40, Review 60, Launch 🚀 80, in source order.
Percent → Percent. Average 62.5, clamped to 0–100; displayed rounding depends on the layout. Use a cell to follow one goal. Caption is optional.
Left number → Value; Right number → Percent. Two column averages: 50 and 62.5 (the right-hand display rounds to 63).
Values → Value. Series 20, 40, 60, 80; latest value 80. Sort the source rows into the order you want to show.
Bar label → Name; Bar value → Value. One bar per item in source order.
Name → Name; Score → Value. Sorted by score, with Launch 🚀 (80) first.
Intensity → Value. A cell for each numeric value in source order. It is not automatically grouped into calendar dates.
Metric → Value. Count 4, average 50, high 80, low 20.
Group by → Status. Ready 2, Queued 1, Done 1.
Next Up: Title → Name; Date → Date.
Countdown: Event → Name; Date → Date. Uses the nearest date today or later. Replace the example’s January 2027 dates when they are no longer upcoming.
Text → Text; Byline → Name. The first text cell with its caption. A cell binding lets you choose another row.
Completion → Percent. 2 of 4 complete. A value of 100 or higher fills a dot; booleans such as true/false do not.
For our full template, map Value → Value; Percent → Percent; Row label → Name; Row value → Value. The template combines the resolved number, meter and repeated rows. Continue to custom layouts.
50%. Percentage-formatted Google Sheets cells export the displayed percentage.YYYY-MM-DD. Dates use the device calendar and time zone; past dates are ignored by upcoming-event layouts.05 / More control, when you want it
Data JSON supplies the values. Add its URL in Sources. Template JSON describes the design. Open Templates → Custom, then Edit JSON template. Keep the two separate.
Paste the example below in the template editor and tap Done. It displays your mapped Value and Caption.
Back in Content, attach your saved source and map Value to Value. Optionally set Caption to a column or fixed text. With our four-row data, the number is 50.
Choose a size that suits your layout, inspect the preview, then Save Widget. The in-app Reference lists the supported building blocks.
{
"padding": 18,
"root": {
"type": "vstack",
"align": "leading",
"spacing": 8,
"children": [
{"type":"text","text":"{{value}}","size":36},
{"type":"text","text":"{{caption}}","size":14}
]
}
}Download all-components template JSON ↓
The larger example is designed for Large or Full Screen. It includes all 11 building blocks: vstack, hstack, zstack, text, spacer, divider, bar, ring, symbol, rect and rows.
{{value}}, {{caption}} and {{percent}} use the mapped slots. {{col.Name}} reads the first row’s Name field. Inside a rows block, use {{row.label}}, {{row.value}} and {{row.index}}.
Placeholders are not executable code. Unknown names stay visible to help you spot typos.
In the template editor, open Examples → Load from URL…. Supply an HTTPS URL that returns template JSON directly. Keeping it linked lets the app re-fetch the design; unlink it to edit a local copy.
Template URLs do not use the data source’s credentials. Use a public, non-sensitive template with no secrets. A template endpoint must return a valid design, not data rows or an HTML repository page.
06 / Know what to expect
After changing your Sheet or endpoint, open Sources → your connection and tap the circular-arrow button (Refresh source). Check Last sync and the Data preview first, then check your widget.
07 / Find the step that needs attention
First inspect the source’s Data preview. If it’s wrong there, fix the connection. If it’s right there but wrong in the editor, check the mappings. If the editor is right but the Home Screen is stale, check the selected saved design and allow iOS time to refresh.
Check the Sheet link in a signed-out browser. Review General access, Viewer download/export access and any organization restrictions. WidgetWire cannot sign in to a private Sheet. Don’t make sensitive data public to work around this; use a safe, separate dataset.
Open the intended tab in a browser and copy its URL with the gid. A deleted tab gives an error instead of silently selecting another one. After switching tabs, recheck the column names used by your widget.
401 usually means missing or invalid credentials; 403 means access was refused. Check Authentication, the header/parameter name and key permissions. HTML usually means a web page or sign-in redirect. Your endpoint must return JSON directly. See authentication setup.
A column-bound Stat averages its numeric values. Choose Pick a cell for one specific total, or return a one-row summary from your endpoint. The example’s Value column produces 50; the Sheet’s B2 cell produces 20.
Check exact header spelling, capitalization, empty cells and number formats. Percentages use 0–100; 0.5 means half of one percent, not 50%. Dots need numeric completion, not true/false. Re-map fields if the schema changed.
Next Up and Countdown ignore past dates. Use unambiguous dates such as YYYY-MM-DD and include an event today or later. Update the sample’s January 2027 dates when needed.
Check the connection and provider status; reduce the response size. For HTTP 429, wait before trying again. WidgetWire does not follow pagination or continuously poll. Repeated manual refreshes may make a rate limit worse.