Under the hood

How Chromilla mixes paint

By Marco, painter and founder of chromilla · Last checked October 2026

Terms used here: Masstone, Tinting strength, Dry shift, Chroma, Value, Hue, Kubelka-Munk, Delta E (dE2000), Pigment code, Gamut.

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 color you see. That's why mixing yellow and blue on canvas gives green, but the same operation on a screen (which is additive) gives gray. Chromilla models the subtractive behavior using Kubelka-Munk style coefficients per pigment, so the recipe matches what your brush actually does.

Ratios matter more than most artists realize. 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 normalizes 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. Watercolor dries lighter as the binder lifts away from the pigment. Oil holds its color 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 color on your canvas, not just the color you see while the paint is still glossy.

Why we aim at the color after it dries

Wet paint lies to you. A puddle of acrylic on your palette looks lighter and glossier than the same color once it's dry and matte on the canvas. Watercolor 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 color 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 color 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 watercolor, and about 1% for oil (small enough that we label oil as "dries true to color"). 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 color 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 gray-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 color straight from the tube with no white added, taken from real paint swatches rather than estimated off a color 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 color, applies the medium's dry-down shift, then compares the dried result to your target using CIEDE2000 color distance. That distance gets mapped onto a 0 to 100 scale: 100 means the dried mix and the target read as the same color 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 color, 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.

How the Brand Converter and palette coverage work

The Brand Converter ranks matches by pigment before color. A paint in the other brand with exactly the same Colour Index codes ranks first, one that shares the main pigment ranks second, and only when neither exists does it fall back to the paint whose masstone is closest, by Chromilla's color model, with a warning that it will mix differently. For palette coverage, Chromilla samples mixes of your tubes across dark, mid and light values and compares them with what a standard studio range can reach. Colors the range reaches but your tubes do not are grouped into a few gap swatches, and the best next tube is the one that fills the most of those gaps, by Chromilla's color model.

How accurate is it, and how do we know

Measured 3 October 2026

Chromilla's regression test suite benchmarks 15 reachable reference colors across acrylic, oil and watercolor, solving each against our 12-entry reference paint palette with a 4-tube limit, and scoring the predicted dry color with CIEDE2000. Watercolor excludes Titanium White, leaving 11 eligible reference entries.

On that internal set of 45 solves, the solver lands a median of 0.47 dE2000, a 95th percentile of 1.91, and a worst case of 3.95 (cream in acrylic). Read that as a test of whether our solver still fits our own color model, not as a measure of how close mixed paint lands. Those are different questions and only the first one is answered here.

Internal model regression only: predicted dry-color dE2000 over 15 deliberately reachable targets per medium, not measured paint.
MediumMedian95th pctMax
acrylic0.762.603.95
oil0.301.461.61
watercolour0.181.251.36

On this reachable internal-model set, not measured paint, 76% of solves land under 1.0 dE2000, 96% of solves land under 2.0 dE2000, and 100% of solves land under 5.0 dE2000.

A further 3 targets sit deliberately outside the reference palette's reach and are reported separately from the reachable set: dioxazine purple has predicted dry-color error of 10.90 to 11.41 dE2000 across the three media in this internal-model benchmark; turquoise has predicted dry-color error of 7.83 to 12.03 dE2000 across the three media in this internal-model benchmark; magenta has predicted dry-color error of 7.11 to 7.85 dE2000 across the three media in this internal-model benchmark. Combining the easy and hard cases into one average would hide these failures. Chromilla has recipe warnings for limited matches, but its gap explanations are model-based, not proof that no real pigment could reach a color.

What this figure does not prove

  • No physical paint was measured. No spectrophotometer, no dried samples, and no allowance for pigment loading, film thickness, paper or lighting.
  • The 15 colors in the reachable set were chosen to be reachable. They are a regression set for catching solver drift, not a sample of what people actually search for.
  • The solver is scored against the same color model it uses to predict. A low number means it fits its own model well.
  • Watercolor is scored after searching for the dilution that best matches a known target. A painter does not get to solve for their dilution against a known answer.
  • Targets arrive as exact hex values, so no camera or color-picking error is included.

Why we do not publish a single headline accuracy figure

A single number flatters the easy cases, and ours would flatter them more than most, because it scores our own solver against our own model on colors picked to be reachable. Publishing 0.47 dE as "Chromilla's accuracy" would be a better looking claim than we can defend. A figure we would stand behind needs several hundred held-out targets per medium, sampled from real requests including the hard ones, run through the full recipe path against real brand palettes, plus a separate physical study measuring dried mixes on a calibrated instrument. We have not done that yet. When we do, the numbers and the method will both be on this page.

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 color 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 gray. 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 gray. Anything that treats screen color and paint color 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%, watercolor 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