05 September 2026 · 3 min read
Widgy is an app which lets you create widgets for your home and lock screen on iOS by using their human-friendly editor. The editor is fine for small widgets, but when it comes to bigger widgets, there is a problem to solve.
Important
This is an unofficial documentation of the.widgyfile format based on files exported by Widgy. It is not affiliated with or endorsed by Widgy. The format may change in future versions.
I am a fan of their app, and I have even purchased the expansion slots for home screen widgets, so I am familiar with the app. There is a feature which lets you export your widgets as a .widgy file. I made a sample widget and exported it, then transferred it to my Mac.
.widgy fileI tried opening it in a text editor, but I was met with binary and unreadable text. I popped it into CyberChef, and used their Magic operation, but that led to no results.
After a bit of messing around in CyberChef, I got a recipe that worked: Raw Inflate. There is no need to change any parameters, as the default parameters worked, but it did give me a readable JSON.
The JSON format was odd. There weren’t readable keys, instead there were these shortened keys such as 0 and d0. This JSON appeared to be generated from a compact internal schema, with short keys being used instead of descriptive names, but I am not going to go too far to extract the schema.
The following root-level fields have been identified:
| Key | Description |
|---|---|
0 |
Format/version identifier (appears to be) |
1 |
Array of layers |
3 |
Widget name |
5 |
Author name |
6 |
Widget size |
The layer object is confusing at first, but I have been able to map some of its fields, including the layer type, names, and handling of groups.
The layer name was stored in the s key. The layer type (z key) appears to be an enum with the following values:
| Value | Description |
|---|---|
| 1 | Text |
| 15 | Curved Text |
| 4 | Symbol |
| 2 | Shape |
| 5 | Image |
| 7 | Line Chart |
| 6 | Bar Chart |
| 8 | Circle Chart |
| 12 | Gauge |
| 16 | Analog Seconds |
| 17 | Apple Gauge |
| 10 | Calendar |
| 11 | Tap Action |
| 13 | Group (needs special handling, see below) |
The group layer type (value 13) is a special case. When a group layer is encountered, the 1 key contains an array of nested layers (just like in the widget root).
Widgy also supports sharing widgets through QR codes. After investigating the QR code data, I found that it contains the widget data itself rather than simply pointing to a download URL.
The QR code payload appears to be a Base64 encoded raw DEFLATE stream containing the same JSON structure used by the .widgy file format.
The process appears to be:
Widget JSON
↓
Raw DEFLATE compression
↓
Base64 encoding
↓
QR code payload
Unlike some Base64 implementations used in URLs, this does not appear to use URL-safe Base64 encoding. The standard Base64 alphabet is used.
This means a QR code can contain a complete widget without requiring an external server or download link.
There are still many unknown fields, including positioning, styling, and data sources. I may continue documenting these as I investigate the format further.