WINDER

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

KeyTypeNotes
versionintAlways 1
albumsarrayIn library order — the order the app shows them in
albums[].idstringUUID v4. Referenced by sidecars
albums[].namestringMay be empty; may collide with another album's
albums[].createdAtstringISO 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