WINDER

roll.json

A roll is a folder. roll.json sits inside it and carries only what a folder cannot: identity, and what the photographer knows about the film.

{
  "version": 1,
  "id": "5f1c2b8e-1a4d-4c77-9e0b-3a6f1d2c8e11",
  "createdAt": "2026-05-04T10:22:31.004",
  "brand": "Kodak",
  "model": "Gold 200",
  "camera": "Pentax 17",
  "lens": "HD Pentax 25mm f/3.5",
  "scanner": "Noritsu HS-1800",
  "scannedAt": "2026-05-02T00:00:00.000",
  "color": "#F2A33C"
}

Fields

KeyTypeNotes
versionintAlways 1
idstringUUID v4. Regenerated and written back if missing
createdAtstringISO 8601. Falls back to the folder's modified time
namestringOnly present when empty. See below
brandstringFilm brand, always in Latin script: Kodak, not 柯达
modelstringFilm model — Gold 200, Superia X-TRA 400
camerastringThe body. One per roll
lensstringFilled in from the camera profile, or typed
scannerstringA lab, a Plustek, a phone over a lightbox
scannedAtstringISO 8601. When the film met the scanner
colorstring#RRGGBB. Also accepts RRGGBB and #AARRGGBB on read

Every field except version is optional. Absent ones are rebuilt from the folder rather than failing the roll. Empty strings are treated as absent and are not written.

The name key

A named roll carries no name key at all. The folder is the answer, which is why renaming it in Finder renames the roll.

An unnamed roll carries "name": "". That is the one thing a folder cannot express: it has to be called something for a file browser to show, so it gets a dated name like Roll 260806, and the empty name records that nobody chose it. Winder then shows the film's name wherever a word is needed, and tacks no sticky note on the shelf.

{ "version": 1, "id": "…", "createdAt": "…", "name": "" }

Why the brand is never translated

brand always holds the Latin name. The app translates it at render time — 柯达, 富士, 乐凯 — so switching the interface language never rewrites the vault, film matching keeps working, and the folder still reads straight in Finder.

Only the brand is translated. An emulsion name is a product name and stays as printed.

Film and camera matching

Winder matches brand + model back to its film catalog, and camera back to its body catalog, ignoring case, spacing and punctuation, plus per-entry aliases for Chinese names and older product names.

This means a hand-typed kodak / gold-200 picks up the right box photo for free, and a film a later version stops shipping loses its picture but never its name. Nothing about the match is stored — it is recomputed from these two words every time.

Gear inheritance

The camera, lens and film on a roll are what every frame on it reports. A frame's own sidecar overrides them when it names its own — it was either filed before the gear moved onto the roll, or edited by hand, and neither is Winder's to overrule.

Changing any of them rewrites the EXIF of every frame on the roll.

Updated 2026-08-06