← back

El Painto

2022 · React, JavaScript, Python

Finds the closest paint across 22 brands by ranking 29,875 colours with CIEDE2000, the perceptual colour-difference formula, instead of RGB distance.

I built El Painto in September 2022, while I was working at a Sherwin-Williams store. Customers would walk in with a HEX or RGB value from a screen, or a colour from a brand we didn’t carry, and ask for the closest thing we had. I wanted a way to give them an answer. I was also curious how the colour scanners at the paint counter decide what “closest” means.

It searches 29,875 colours from 22 paint brands. Type a name (“Agreeable Gray”), a code (“7029”), a HEX value or an RGB triple, then pick a colour to see its closest matches in every other brand. I’d always tell customers the match can look a bit different once it’s on the wall, so it’s a starting point for a sample, not a guarantee.

Matching uses CIEDE2000, a colour-difference formula built around how people actually see colour. Every colour is converted from sRGB to CIELAB, and matches are ranked by ΔE00 (via the DeltaE library) instead of raw RGB distance, which ranks colours in ways people don’t perceive.

It peaked at 100+ monthly users. Four years later, with no marketing, about 30 people still use it every month, mostly people who work with paint. My favourite moment was finding a stranger on Reddit recommending it with the same advice I used to give customers: use the match as a starting point and test a sample.

What I changed later: the whole colour database (3.3 MB of JSON) used to ship inside the JavaScript bundle, and Lab values were recomputed on every search. Now a build step precomputes the Lab values, the colour list loads as a separate compact file, and each brand’s Lab values download only when that brand is searched. The script went from about 450 kB to 53 kB compressed, and the matches are the same as before.