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
| Key | Type | Notes |
|---|---|---|
version | int | Always 1 |
id | string | UUID v4. Regenerated and written back if missing |
createdAt | string | ISO 8601. Falls back to the folder's modified time |
name | string | Only present when empty. See below |
brand | string | Film brand, always in Latin script: Kodak, not 柯达 |
model | string | Film model — Gold 200, Superia X-TRA 400 |
camera | string | The body. One per roll |
lens | string | Filled in from the camera profile, or typed |
scanner | string | A lab, a Plustek, a phone over a lightbox |
scannedAt | string | ISO 8601. When the film met the scanner |
color | string | #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