Kredi Lab docs ← KREDI Lab

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

PathPurpose
~/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.plistSidecar 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, FTSP magic) — 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
  }
}
KeyGrain controlRangeDefault
amountAmount0–1008
sizeSize1–62
colorColor0–10070
responseResponse−100–1000
shadowLiftShadow Lift0–1000
midtoneMidtone0–10020
midWidthMid Width10–10030
highlightHighlight0–10040
filmFormatFilm Format"Off", "8mm", "16mm", "35mm", "65mm""Off"
filmResolutionFilm Resolution0–100100

Rules when writing one by hand:

  • format must be "klgrain" and values must 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.
  • filmFormat is the gauge’s name, exactly as in the menu.
  • If name is 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.2
  • sRGB (piecewise)
  • Rec.709 (BT.1886)
  • sRGB
  • Gamma 2.2 Rec.709
  • Rec.2100 PQ (HDR)
  • P3 D65
  • Display P3
  • ST2084 P3 D65 (HDR)
  • Apple Log
  • LogC v3 (Alexa)
  • LogC v4 (ALEXA 35)
  • BMDFilm Gen5 / Wide Gamut
  • EOS
  • EOS C100 Mark II TypeA D55
  • EOS C100 Mark II TypeA Tungsten
  • EOS C300 Mark II Log BT2020 TypeD D55
  • EOS C300 Mark II Log BT2020 TypeD Tungsten
  • EOS C300 Mark II Log CinemaGamut TypeC D55
  • EOS C300 Mark II Log CinemaGamut TypeC Tungsten
  • EOS C300 Mark II Log2 BT2020 TypeB D55
  • EOS C300 Mark II Log2 BT2020 TypeB Tungsten
  • EOS C300 Mark II Log2 CinemaGamut TypeA D55
  • EOS C300 Mark II Log2 CinemaGamut TypeA Tungsten
  • EOS C300 Mark II Log3 BT2020 TypeF D55
  • EOS C300 Mark II Log3 BT2020 TypeF Tungsten
  • EOS C300 Mark II Log3 CinemaGamut TypeE D55
  • EOS C300 Mark II Log3 CinemaGamut TypeE Tungsten
  • Canon Log 2 / Cinema Gamut
  • Canon Log 3 / Cinema Gamut
  • D-Log / D-Gamut
  • F-Log / BT.2020
  • F-Log2 / BT.2020
  • L-Log / BT.2020
  • N-Log / BT.2020
  • V-Log / V-Gamut
  • Log3G10 / RED Wide Gamut
  • SLog 10i
  • SLog2 Daylight 10i
  • SLog2 Tungsten 10i
  • SLog3
  • S-Log3 / S-Gamut3.Cine

lmt — film stocks

  • Kodak 2383
  • Kodak 2393
  • Kodak 2302 B&W
  • Fuji 3510
  • Fuji 3513
  • Fuji 3519
  • Fuji 3521
  • Agfa CP30

odt — output transforms

  • SDR Rec.709 (BT.1886)
  • SDR sRGB
  • SDR P3 D65
  • HDR Rec.2020 PQ (1000 nits)