Methodology · version 1.0

How BrushForge builds a paint-match shortlist

This page documents the current public-web catalogue pipeline, CIEDE2000 calculation, candidate filters, update policy, and limits. It describes catalogue-based matching—not physical measurement of every paint.

Scope in one sentenceBrushForge converts stored sRGB catalogue colours to CIELAB under D65, restricts compatible candidates to the exact same behaviour family, ranks them with CIEDE2000 using default weighting, and returns the nearest eligible recorded colour with context and limitations.

Current public facts

Fact manifest verified2 August 2026
Public web catalogue2,941 generated paint pages from the 10 July 2026 data snapshot
Native app catalogue4,300+ paints; a broader product surface than the public web catalogue
Public brands in snapshot8
Web behaviour families2,154 opaque; 274 metallic; 301 single-coat; 148 wash; 42 ink; 10 glaze; 12 other translucent
PlatformsAndroid and iOS; core tools work offline

1. Catalogue records and colour sources

The source library stores a stable paint identifier plus brand, name, code, line, line variant, product type, finish, colour data, tags, lifecycle state, update timestamp, and maintenance notes. The web generator uses only records with a usable stored colour and an eligible classification.

Catalogue work combines manufacturer-supplied data where available, published manufacturer or retailer product information, and manual curation and cleaning. Some manufacturers have supplied data directly; other records require research and reconciliation. The current public pages do not expose a source URL or measurement method for each colour record.

No blanket physical-measurement claimA stored hex value is not described as a spectrophotometer reading or controlled brushout unless that provenance is explicitly documented for the record. At present, public recommendations should be read as catalogue-based colour comparisons.

2. Inclusion and exclusion

A record needs an RGB/hex colour and a supported miniature-paint classification. The current web pipeline excludes technical products, varnishes, mediums, auxiliaries, primers, markers, effect products, and air-specific paints from conversion pools. Records tagged as effect, varnish, pigment, or placeholder colour are also excluded. Dry paints are logged separately rather than forced into a colour-matching pool.

Lines identified as auxiliary products, weathering effects, pigment effects, diorama effects, varnish, primer, air, airbrush, spray, or mecha are outside the normal pool. This reduces comparisons between products intended for materially different jobs.

Some records remain valid page subjects but are not recommended in cross-brand results. The current policy excludes Vallejo Arte Deco variants and AK Interactive AFV, Naval, and General Series from ordinary recommendations. Visibility and recommendation eligibility are deliberately separate.

3. Identity and duplicate handling

Paths begin with a normalized paint name within a brand. If that would collide, the generator adds line, line variant, code, and finally a counter. The visible title should include enough of brand, range, and code to distinguish repeated names.

The 10 July snapshot contains 405 repeated name groups across the public catalogue and 296 repeated groups within a brand. No exact identity duplicates remain when brand, line, name, and code are considered together. Alias and lifecycle work is reviewed separately because two records with similar names are not automatically the same product.

4. sRGB → XYZ D65 → CIELAB

For each 8-bit channel, BrushForge divides by 255 and applies the standard sRGB inverse transfer function:

  • c / 12.92 when c ≤ 0.04045
  • ((c + 0.055) / 1.055)2.4 otherwise

Linear RGB is converted to XYZ with the sRGB D65 matrix:

RGB
X0.41245640.35757610.1804375
Y0.21267290.71515220.0721750
Z0.01933390.11919200.9503041

XYZ is converted to Lab against D65 reference white Xn = 0.95047, Yn = 1.0, Zn = 1.08883. The usual CIELAB piecewise function uses δ = 6/29. No additional chromatic adaptation is applied because both the stored sRGB interpretation and Lab reference use D65 in this implementation.

5. Strict behaviour families

The generator retains three broad display pools—standard, translucent, and metallic—but does not use that broad translucent grouping to claim compatibility. Every eligible record also receives one of seven strict behaviour families:

FamilyClassification ruleSnapshot count
OpaqueStandard-pool colour, base, or layer records2,154
MetallicMetallic finish274
Single-coatContrast or Speedpaint type, or line/type text containing Contrast, Speedpaint, or Xpress301
WashWash type, or line/type text containing wash or shade148
InkInk type, or line/type text containing ink42
GlazeGlaze type, or line/type text containing glaze10
Other translucentRemaining translucent records not assigned above12

A compatible candidate must match the source family, requested target brand, and recommendation policy. If a source has no target in the same family, a record from another translucent family may be shown only as a warned reference with the text “No close same-type equivalent found; nearest recorded color shown.” It is not called compatible.

6. CIEDE2000 distance and ranking

BrushForge calculates the complete CIEDE2000 formula on the source and candidate Lab coordinates with kL = kC = kH = 1. It ranks eligible candidates by the resulting distance and selects the smallest value. Calculation uses full floating-point precision; public displays round for readability.

There is no statistical confidence model behind a colour conversion. A lower distance is simply a closer recorded colour under this formula and input set; it is not a probability of physical equivalence.

ΔE2000BrushForge labelInterpretation
0Same recorded color valueStored inputs match; physical paint is not proven identical
>0–2Very close color matchUsually difficult to distinguish under comparable conditions
>2–5Close color matchUseful substitution shortlist
>5–10Noticeable differenceInspect swatches and use case carefully
>10Different colorAlternative, not an equivalent

7. Reference and boundary tests

The Python generator and browser result code share the tier boundaries. Boundary tests cover 0, 0.1, 2, 2.1, 5, 5.1, 10, and 10.1. The CIEDE2000 implementation is checked against the published Sharma, Wu, and Dalal reference pairs to catch sign, hue-angle, and rotation-term errors.

8. Known limitations

  • Catalogue colours can be approximate and can vary in provenance.
  • A single stored colour cannot represent opacity, coverage, hue bias, viscosity, or drying shift.
  • Metallic reflectance and particle behaviour are not represented by a flat sRGB value.
  • Washes and transparent one-coat paints depend strongly on undercoat, pooling, and application.
  • Batch variation, product age, reformulation, and lighting are not modelled.
  • Screen swatches vary with display calibration, gamut, True Tone, Night Shift, brightness, and ambient light.
  • The public catalogue and native app catalogue are separate snapshots and may not update simultaneously.

Use swatches for relative comparison, then verify with physical paint when the final appearance or finish matters. Aim for ΔE ≤5 as a shortlist—not a promise.

9. Update and correction policy

Generated pages use the latest source-record update date rather than a hard-coded build date. Catalogue additions and changes are regenerated across paint pages, charts, browser data, internal links, and sitemaps. A second generator run should produce no unexplained changes.

To report an error, use brushforgeapp@gmail.com. Include the page URL, brand, range, paint name, code, proposed correction, and a manufacturer link or clear label photo where possible. Reports are reviewed before the source library changes.

Methodology changelog

DateVersionChange
2026-08-021.0Published source scope, exact conversion path, strict behaviour families, non-overlapping interpretation tiers, test policy, limitations, and correction workflow. Removed synthetic confidence wording from public matching.
2026-07-10SnapshotCurrent public dataset source-update date: 2,941 records across eight brands.

References

Found a questionable match or record?

Send the exact paint identity and supporting evidence. Correction reports improve the catalogue for every painter.