Kredi Lab Presets — Location & File Format
Reference for .kredipreset files: where they live, what they contain,
and what each field does. Describes format version 2 (plug-in
1.0.15+). Presets saved by earlier versions use an older format and can
no longer be applied — re-create the look and save it again. For
browsing, previewing and applying presets — including partial applies
via Apply Filters — see The Gallery.
Where presets live
| Path | Purpose |
|---|---|
~/Library/Application Support/Kredi Lab/Presets/ | The preset library. Every .kredipreset here appears in the Presets Gallery. |
…/Presets/<Folder>/ | One level of subfolders — each becomes a group in the gallery sidebar (My Presets). |
…/Presets/.ratings.plist | Sidecar for stars/favourites set in the gallery, keyed by library-relative path. Preset files themselves are never rewritten by rating. |
…/Kredi Lab/Embedded LUTs/ | Custom LUTs materialised from presets that embed one (content-addressed; safe to leave alone). |
…/Kredi Lab/LUTs/ | The LUT library shown in the gallery’s LUTS section (.cube files, one level of subfolders). Ratings share the same sidecar system. |
…/Kredi Lab/Grain Presets/ | Your grain presets (.klgrain). They appear in the Grain section’s Preset menu, sorted by name, below the built-in ones. |
Save Preset… in the inspector writes into the library root by default. Files added in Finder (or via Import Presets…) are picked up live.
File format
A .kredipreset is a UTF-8 JSON document. Two variants exist:
- Open (
"format": "kredilab.scene") — everything you save yourself. Fully readable and hand-editable; documented below. - Sealed (binary,
FTSPmagic) — distributed collections from the online gallery. Not editable; produced only by the Kredi Lab publishing pipeline.
Comments below (//) are annotation only — real files are plain JSON
and must not contain them.
The document
{
"format": "kredilab.scene", // file magic — always exactly this
"version": 2, // format version — required, always 2
// ── Metadata ──────────────────────────────────────────────────────
"name": "Kodak Warm Evening", // gallery card title
"category": "Film", // optional, free-form
"author": "Jon Snow", // optional credit
"created": "2026-07-17T18:30:00Z", // optional ISO-8601 timestamp
// Card image: EITHER an embedded PNG (written at save time, 640 px
// wide) OR a path, absolute or relative to the preset file (640×360
// recommended). If both are present the embedded PNG wins.
"thumbnail": "<base64 PNG>",
"thumbnailPath": "thumbs/warm-evening.png",
// ── Colour management, by NAME (not menu index) ──────────────────
"idt": "S-Log3 / S-Gamut3.Cine", // omit → keep the clip's input transform
"lmt": "Kodak 2383", // film stock; omit → None
"lmtBypass": true, // only when the film-stock row is
// switched off (selection kept)
"odt": "SDR Rec.709 (BT.1886)",
// ── Embedded custom LUT (only when saved with "Embed LUT") ───────
// When present, the embedded LUT wins and creativeLook.selection
// is omitted.
"lut": "<base64 .cube contents>",
"lutFileName": "warm_evening.cube",
// ── The grade itself ──────────────────────────────────────────────
"stages": { … } // see below
}
The stages object
Each key is a stage, each value an object of camelCase parameter keys. Presets are sparse: only parameters that differ from their defaults are recorded. Applying a preset first resets the grade to defaults, then overlays the recorded values — so a sparse file still reproduces the look exactly.
Every stage takes "bypass": true when its section is switched off
(present only then — a missing bypass means the section keeps its
default state). Sliders may carry a <name>Bypass companion when the
individual row is bypassed. Popup selections are stored by their
visible menu name, never a number. Unless noted, numeric values
match the inspector sliders one-to-one — the value you see in the UI is
the value in the file.
"stages": {
"whiteBalance": {
"temperature": 5600, // Kelvin
"tint": 0.05
},
"base": {
"exposure": 0.35, // EV
"contrast": 0.10,
"pivot": 0.45,
"highlights": -0.15,
"shadows": 0.05,
"whites": 0.0,
"blacks": 0.0,
"saturation": 0.10,
"vibrance": 0.05
},
"tone": {
"shadows": 12, "darks": 0, // parametric range adjustments
"lights": -5, "highlights": 0,
"split1": 0.25, // range split points, 0–1 positions
"split2": 0.50, // between the four zones
"split3": 0.75,
// Freeform curves: control points as [x, y] pairs, both axes
// 0–255, x ascending. A missing channel is identity. The curve
// through the points is a natural cubic spline.
"curves": {
"luma": [[0, 0], [62, 70], [255, 255]],
"red": [[0, 0], [255, 255]]
}
},
"colorWheels": {
// Four wheels: lift, gamma, gain, global — each with the same keys.
"liftRed": 0.02, // colour offset
"liftGreen": 0.00,
"liftBlue": -0.02,
"liftMaster": 0.05, // level
"liftBypass": true, // wheel disabled
"shadowsRange": 0.33, // zone falloff
"highlightsRange": 0.66,
"shadowsSat": 1.0, // per-zone saturation (0–2, 1 = neutral)
"midsSat": 1.0,
"highsSat": 1.0
},
"selectiveColor": {
// Eight vectors: red, orange, yellow, green, cyan, blue, violet,
// magenta — each with Hue / Sat / Val.
"redHue": 0.05, // hue shift (−0.5…0.5)
"redSat": 0.20, // saturation (−1…2)
"redVal": 0.00 // level (−0.5…0.5)
},
"cameraMatrix": { // 3x3 channel mixer (see note below)
// Nine coefficients, named <output><input>. matrixRB is how much of the
// ORIGINAL BLUE ends up in the FINAL RED. Absent keys are identity, so an
// untouched stage writes nothing at all.
"matrixRR": 0.63, "matrixRG": 0.00, "matrixRB": 0.37,
"matrixGR": 0.00, "matrixGG": 0.72, "matrixGB": 0.28,
"matrixBR": 0.00, "matrixBG": 0.00, "matrixBB": 1.00,
"matrixBasis": "Rec.709", // gamut the editor draws against, BY NAME:
// "Rec.709" | "Rec.2020" | "DCI-P3" | "ACEScg"
"preserveNeutrals": 1 // 1 = rows constrained to sum to 1, so a
// neutral grey stays neutral
},
"creativeLook": {
"strength": 0.8, // LUT mix amount
"tone": 0.0, // tone trim around the LUT
"chroma": 0.0, // chroma trim around the LUT
// ONE selection field. Forms:
// "none" — no look
// "bundled:Looks_1" … "bundled:Looks_4"
// "/path/to/my.cube" — custom LUT by absolute path
// "sealed:<hash>" — LUT from a sealed collection
// (resolves in memory — never a file)
// Omitted when the preset embeds a LUT (top-level "lut" wins).
"selection": "bundled:Looks_2",
"hdrSafe": false, // HDR-safe LUT application (default true)
"lutInput": "Rec.2020 PQ", // LUT input/output colour spaces by
"lutOutput": "Rec.709 Gamma" // menu name — see below
},
"colorDensity": {
"printerGang": false, // printer lights R/G/B gang (default true)
"printerRed": 25, // printer light offsets
"printerGreen": 25,
"printerBlue": 25,
"gammaAll": 1.0, // density gammas
"gammaCyan": 1.0,
"gammaMagenta": 1.0,
"gammaYellow": 1.0,
"shadowProtect": 0.0,
"highlightProtect": 0.0,
"warmCool": 0.0 // density bias: − cooler, + warmer
},
"clarity": {
"shadows": 0.0, // range amounts
"highlights": 0.0,
"shadowDetail": 0.0,
"highlightDetail": 0.0,
"spatialScale": 0.5
},
"skinRefine": {
"amount": 0.5, "mix": 0.5,
"detail": 0.5, "contrast": 0.0,
"hueCenter": 25, // skin hue selection
"hueRange": 20,
"darkThreshold": 0.1,
"lightThreshold": 0.9,
"satLow": 0.1, "satHigh": 0.9,
"toneSat": 0.0, "toneShift": 0.0
},
"sharpness": {
"amount": 0.3
},
"diffusion": {
"style": "Balanced", // by menu name: Subtle, Fine Detail,
// Balanced, Medium, Delicate, Compact,
// Dreamy, Natural, Whisper
"amount": 0.4,
"threshold": 0.7,
"spread": 0.5,
"highlight": 0.5,
"midtone": 0.2,
"saturation": 0.5,
"tintAmount": 0.0, // glow tint
"tintHue": 40 // hue in degrees
},
"grain": {
"amount": 50,
"size": 50,
"color": 30, // chroma of grain
"response": 50,
"filmResolution": 100, // 100 = sharp
"highlight": 40,
"shadowLift": 0,
"midCenter": 20,
"midWidth": 30
},
"vignette": {
"color": [1.0, 0.95, 0.9], // vignette tint, RGB 0–1
"amount": 0.3,
"exposure": -0.5,
"midpoint": 0.5,
"roundness": 0.0,
"feather": 0.5
}
}
The LUT colour-space names for lutInput / lutOutput are:
Rec.709 Gamma, Rec.2020 Gamma, Rec.2020 PQ, Rec.2020 HLG,
Rec.2020 Linear.
Hand-crafting guidance
The reliable workflow: grade in Kredi Lab, Save Preset…, then edit the
file. Everything in a v2 preset is hand-editable — including the tone
curve points. Editing parameter values by hand bypasses UI clamping, so
out-of-range values are applied as-is. Remember the // comments in
this document are illustrations — a real .kredipreset must be plain
JSON.
Menu names (popups, idt/lmt/odt, lutInput/lutOutput,
diffusion.style) must match the app’s menu wording exactly; an
unknown name is skipped with a log message rather than guessed at.
Keyframed animation is not part of a preset: presets capture the static grade.
Older presets (format 1)
Files without "version": 2 — everything saved before plug-in 1.0.15 —
can no longer be applied. Their gallery cards still show (name and
thumbnail are unchanged), but Apply reports that the preset needs
re-saving. Re-create the look in the inspector and save it again.
Camera Matrix in presets saved before 1.0.17
Plug-in 1.0.17 replaced the Camera Matrix stage’s six hue/saturation
sliders with a 3x3 channel mixer. The old keys — redHue, redSat,
greenHue, greenSat, blueHue, blueSat — are no longer read.
A preset saved before 1.0.17 still applies, and every other stage in it is unaffected; only its Camera Matrix contribution is dropped. If a preset relied on that stage, re-create the correction with the new control and save it again.
This did not change the file format version, which stays 2: the new
keys live inside the same cameraMatrix object.
Grain presets (.klgrain)
A grain preset holds one look for the Grain section only. It is a small
UTF-8 JSON file with the .klgrain extension — the same thing Save
Current as Preset… writes. This is the built-in 16mm preset:
{
"format": "klgrain",
"version": 1,
"name": "16mm",
"values": {
"amount": 20.588,
"size": 2.015,
"color": 0,
"response": 28.757,
"shadowLift": 70.192,
"midtone": 0,
"midWidth": 10,
"highlight": 79.512,
"filmFormat": "16mm",
"filmResolution": 78.223
}
}
| Key | Grain control | Range | Default |
|---|---|---|---|
amount | Amount | 0–100 | 8 |
size | Size | 1–6 | 2 |
color | Color | 0–100 | 70 |
response | Response | −100–100 | 0 |
shadowLift | Shadow Lift | 0–100 | 0 |
midtone | Midtone | 0–100 | 20 |
midWidth | Mid Width | 10–100 | 30 |
highlight | Highlight | 0–100 | 40 |
filmFormat | Film Format | "Off", "8mm", "16mm", "35mm", "65mm" | "Off" |
filmResolution | Film Resolution | 0–100 | 100 |
Rules when writing one by hand:
formatmust be"klgrain"andvaluesmust be an object, or the file is skipped.- Any key you leave out is set to its default, and values outside a control’s range are clamped — a partial preset still gives a predictable result.
- Unknown keys are ignored, so a grain preset only ever changes Grain.
filmFormatis the gauge’s name, exactly as in the menu.- If
nameis missing or empty, the file name is used. - A file that isn’t valid JSON doesn’t appear in the menu.
To share a grain preset, send the file; the recipient drops it into their Grain Presets folder (Show Presets in Finder in the Preset menu opens it). The menu picks it up the next time it’s opened.
Appendix — valid idt / lmt / odt names
The names below are the exact strings the loader accepts (they are the
menu names in the ACES Color Management section). "None" is also
valid everywhere it appears in the menus; omitting the field entirely
means “keep the clip’s current setting” for idt and “None” for lmt.
idt — input transforms
Rec.709 γ 1.96 (QuickTime)Rec.709 BT.1886 (γ 2.4)Rec.709 γ 2.2sRGB (piecewise)Rec.709 (BT.1886)sRGBGamma 2.2 Rec.709Rec.2100 PQ (HDR)P3 D65Display P3ST2084 P3 D65 (HDR)Apple LogLogC v3 (Alexa)LogC v4 (ALEXA 35)BMDFilm Gen5 / Wide GamutEOSEOS C100 Mark II TypeA D55EOS C100 Mark II TypeA TungstenEOS C300 Mark II Log BT2020 TypeD D55EOS C300 Mark II Log BT2020 TypeD TungstenEOS C300 Mark II Log CinemaGamut TypeC D55EOS C300 Mark II Log CinemaGamut TypeC TungstenEOS C300 Mark II Log2 BT2020 TypeB D55EOS C300 Mark II Log2 BT2020 TypeB TungstenEOS C300 Mark II Log2 CinemaGamut TypeA D55EOS C300 Mark II Log2 CinemaGamut TypeA TungstenEOS C300 Mark II Log3 BT2020 TypeF D55EOS C300 Mark II Log3 BT2020 TypeF TungstenEOS C300 Mark II Log3 CinemaGamut TypeE D55EOS C300 Mark II Log3 CinemaGamut TypeE TungstenCanon Log 2 / Cinema GamutCanon Log 3 / Cinema GamutD-Log / D-GamutF-Log / BT.2020F-Log2 / BT.2020L-Log / BT.2020N-Log / BT.2020V-Log / V-GamutLog3G10 / RED Wide GamutSLog 10iSLog2 Daylight 10iSLog2 Tungsten 10iSLog3S-Log3 / S-Gamut3.Cine
lmt — film stocks
Kodak 2383Kodak 2393Kodak 2302 B&WFuji 3510Fuji 3513Fuji 3519Fuji 3521Agfa CP30
odt — output transforms
SDR Rec.709 (BT.1886)SDR sRGBSDR P3 D65HDR Rec.2020 PQ (1000 nits)