Under the hood

How Chromilla mixes paint

Real paint mixing is subtractive, not additive. When you blend two tubes on a palette, each pigment absorbs part of the light and what's left over is the colour you see. That's why mixing yellow and blue on canvas gives green, but the same operation on a screen (which is additive) gives grey. Chromilla models the subtractive behaviour using Kubelka-Munk style coefficients per pigment, so the recipe matches what your brush actually does.

Ratios matter more than most artists realise. A drop too much Phthalo Blue can swing a sky from dawn to midnight, because tinting strength varies wildly between pigments - Quinacridone Magenta and Titanium White can be 20× stronger per gram than the earth pigments next to them in the box. Chromilla normalises for tinting strength so the parts you see are the parts you actually squeeze, not a misleading 50/50 that lands nowhere near the target.

Brand calibration is where most generic mixing tools fall down. Daniel Smith Phthalo Blue is not the same as Winsor & Newton Phthalo Blue - same pigment index (PB15), different binder, pigment load, and tinting strength. Chromilla applies a per-tube modifier for each major brand, so the percentages shift when you change brand. Pick the tubes you actually own and the recipe is tuned to your palette, not a textbook average.

Brand calibration in practice

Generic PB15 recipe

Noticeably off blue-green

Winsor & Newton PB15 (calibrated)

Correct phthalo blue

Same pigment index. Different binder load. The recipe shifts when you select your brand.

Medium matters too. Watercolour dries lighter as the binder lifts away from the pigment. Oil holds its colour but takes hours to level. Acrylic shifts darker as the milky binder turns clear. Chromilla applies a drying-shift correction per medium so the wet mix on your palette matches the dry colour on your canvas, not just the colour you see while the paint is still glossy.

Why we aim at the colour after it dries

Wet paint lies to you. A puddle of acrylic on your palette looks lighter and glossier than the same colour once it's dry and matte on the canvas. Watercolour looks darker wet than it lifts to once the water's gone. If a mixing tool matches your target to the wet paint on your palette, it's matching the wrong thing: the colour you'll actually live with is the dry one.

So Chromilla's solver doesn't aim at the wet mix. It runs the whole search against the colour the paint will be once dry, per medium. The exact numbers the code uses today are a 10% value shift for acrylic (dries darker), an 8% shift for watercolour, and about 1% for oil (small enough that we label oil as "dries true to colour"). Those aren't marketing-rounded, they're the constants sitting in the drying-shift table. The match percentage on your recipe card isn't how close the wet blob on your palette looks to the target, it's how close the dried colour is, because that's the number that actually matters once the piece is finished.

In practice this changes the recipe, not just the label. A target that reads as a mid grey-green pulls an acrylic recipe toward slightly more pigment and slightly less white than a wet-only match would suggest, because the solver already knows the mix will lighten as the white content dries down. Skip that step and you get a recipe that nails the wet swatch and drifts once it's dry, the exact moment you can't undo it.

Where the pigment data comes from

Every pigment in Chromilla's library starts from a measured CIELAB reading of its masstone, the pure colour straight from the tube with no white added, taken from real paint swatches rather than estimated off a colour chart. Ultramarine Blue (PB29), Cadmium Red Light (PR108), Yellow Ochre (PY42), Titanium White (PW6) and the rest of the working palette all trace back to this reference data, not to a generic 'blue' or 'red' guess.

From there, each brand's actual paint (Winsor & Newton, Golden, Old Holland, and the rest) gets a tinting-strength and pigment-load modifier layered on top, so the same pigment index behaves like the tube you actually own, not a textbook average. We're plain about the limits here: the base pigment masstone data is measured, but the mixing curves for less common pigments are derived from that masstone and transparency data rather than individually fit to a spectrophotometer, and any recipe using your own tube-calibration scan is an approximation of that scan, not a lab reading. Where that matters, we say so on the recipe card instead of quietly rounding up.

Brand calibration at the scale we actually run it

Here's the honest state of the catalog underneath the app, tube for tube. 25 brands total. 6 of them are full manufacturer-sourced catalogs, 572 tubes between them: Golden Heavy Body Acrylic (31 tubes, all 31 masstone-anchored), Winsor & Newton Professional Watercolour (104 tubes), W&N Artists' Oil (133 tubes), W&N Professional Acrylic (80 tubes), Daniel Smith Extra Fine watercolour (212 tubes), and Daler-Rowney System 3 acrylic (12 tubes, all 12 masstone-anchored). Every entry in those catalogs is sourced from the manufacturer's own composition tables or from measured CIELAB, nothing invented.

16 more brands (Liquitex Heavy Body and Soft Body, Daler-Rowney Georgian Oil, Gamblin, Michael Harding, Old Holland, Rembrandt, Holbein, M. Graham, QoR, Schmincke, Sennelier, Amsterdam Standard, plus the three Van Gogh media) ship a working anchored 5-pigment primary set today. That set is the genuinely shared core, PW6, PBk9, PR108, PY35, PB29, the same pigments those brands use across the range. Their full tube lists are flagged as pending, because the manufacturers publish their pigment data on JavaScript-gated pages that need a manual pass. We'd rather show "pending" than fabricate the missing rows.

The remaining 3 brands (Biltema, Clas Ohlson, Vallejo) are labelled as hobby-grade estimates, because those makers publish no pigment information at all. Everything on the app rests on a shared reference of 45 pigments with measured CIELAB masstones, taken from Golden's published spectrophotometer data. That reference is what "PB29 in your tube" gets checked against before the solver commits to a recipe.

What a match percentage actually means, and why we sometimes tell you it's bad

The number next to your recipe is a perceptual distance, not a marketing confidence score. The solver takes the mix it's about to recommend, runs it through the Kubelka-Munk model to predict the wet colour, applies the medium's dry-down shift, then compares the dried result to your target using CIEDE2000 colour distance. That distance gets mapped onto a 0 to 100 scale: 100 means the dried mix and the target read as the same colour to the eye, and the number falls off as the two drift apart. It's the same number in the swatch header, in the analytics event, and in the feedback record, so what you see is what the app is judging itself against.

When that number drops below 75, the recipe card now shows a banner naming the actual limiting factor instead of quietly serving a bad mix as though it were fine. Three cases: primaries-only mode is on and the target sits outside what red, yellow, and blue can physically reach; your saved palette is too small and doesn't hold a pigment that could pull the mix the right way; or the target is genuinely outside the gamut of real paint (neon and fluorescent hexes are the honest example, no pigment on the market reproduces them). Each version of the banner points at the fix that actually helps for that case rather than pretending all three are the same problem.

We deliberately don't publish a lab-grade ΔE accuracy claim the way some competitors do, and here's why: our K/S values for most pigments are derived from measured masstone and transparency data, not individually fit against a spectrophotometer trace for every mix. That's enough to get recipes that land close, and to be honest about when they won't. If you need the last few points of accuracy on a specific colour, Mix Correction is the tool for that. It exists specifically to close the gap the static prediction leaves: you paint a swatch, the app reads it, and the correction recipe accounts for whatever your particular paper, brush, dilution, and lighting did to the wet mix the model couldn't see.

A worked example: mixing #5E6E4A in oil

Pick a real target: #5E6E4A, a slightly murky olive drab, the kind of green you actually see on foliage in overcast light rather than the postcard version. Naive averaging fails on this colour before you start. If you took "yellow" and "blue" as pure sRGB values and averaged them on the screen, you'd land near #808080, a neutral grey. Paint on canvas doesn't work that way. Yellow pigment absorbs blue light, blue pigment absorbs red and yellow, and when you overlay them physically what's left is green, not grey. Anything that treats screen colour and paint colour as the same operation gets olive drab wrong by 40+ points before it even considers your tubes.

Chromilla's solver runs this target against the full oil-medium pigment set. The recipe it settles on is about 60% Titanium White, 17% Burnt Umber, 12% Burnt Sienna, and 11% Phthalo Blue, four tubes total, staying under the 4-tube cap. Titanium White is the dominant "carrier" that sets the value, Burnt Umber does the real work of shifting a neutral toward a warm green-brown, Burnt Sienna adds the ochre warmth that keeps it from reading as pond scum, and Phthalo Blue pulls the whole mix toward green in just the right amount, kept small because phthalo is one of the strongest tinting pigments in the box.

Because this is oil, the dry-down shift the solver applies is about 1%, small enough that the wet and dry RGB values are effectively the same. The mixed sRGB the model predicts is #5E6F4B, one unit off the target on the green channel, one unit off on the blue. CIEDE2000 between target and dried mix works out under 0.5, which is well below the "just noticeable difference" threshold for the human eye. The match score the recipe card renders is 99%. That's what the recipe card shows: the four pigments with their proportions, the mixed swatch next to your target for a visual check, the 99% pill in green (because it's above the 85 threshold), and no low-match banner because the mix landed inside the honest zone. If it had come out at 68% instead, the banner would have appeared underneath, naming palette reach or gamut as the reason and pointing at the fix.

The engine also models what happens after the brush: dry-down shift per medium (acrylic 10%, watercolour 8%, oil around 1%), per-brand tinting strength, and, for premium users who scan their own tubes, per-tube calibration that overrides our catalog data with the paint you actually own. Approximate by nature, honest by design: a phone scan is not a spectrophotometer, and we label it accordingly.

← Back to mixing