albums.json
An album is a label, not a place. This file at the library root defines them; membership lives in each frame's sidecar as a list of ids.
{
"version": 1,
"albums": [
{
"id": "7c1e9b40-52a8-4c3f-9d16-8b0e2a5f7c33",
"name": "Portraits",
"createdAt": "2026-05-04T10:22:31.004"
},
{
"id": "b2049fa1-6d38-4e12-8a7c-1f5b3d9e0a44",
"name": "Rome 2026",
"createdAt": "2026-05-09T18:03:12.771"
}
]
}
Fields
| Key | Type | Notes |
|---|---|---|
version | int | Always 1 |
albums | array | In library order — the order the app shows them in |
albums[].id | string | UUID v4. Referenced by sidecars |
albums[].name | string | May be empty; may collide with another album's |
albums[].createdAt | string | ISO 8601. Defaults to now if it won't parse |
An entry missing id or name is dropped on read: there is nothing to show
and nothing to match sidecars against, so guessing would be worse than
skipping.
If the whole file won't parse, the library loads with no albums rather than failing — a broken definitions file must never take the photographs with it. Sidecars keep their ids either way, so fixing the file restores every membership.
Why ids and not names
A rename is one write here instead of a sweep through every sidecar in the library, and two albums can share a name without silently merging.
It also means an album is only defined here. Delete an entry and the ids sitting in sidecars become inert: they match nothing and cost nothing. Restore the entry — by hand, or by a sync catching up — and every frame that wore it wears it again.
Deleting
Deleting an album is the one deletion in Winder that doesn't go to .trash,
because an album owns no files. The entry is removed here and the id is
stripped from every sidecar carrying it. No image moves.
Updated 2026-08-06