Current public facts
| Fact manifest verified | 2 August 2026 |
|---|---|
| Public web catalogue | 2,941 generated paint pages from the 10 July 2026 data snapshot |
| Native app catalogue | 4,300+ paints; a broader product surface than the public web catalogue |
| Public brands in snapshot | 8 |
| Web behaviour families | 2,154 opaque; 274 metallic; 301 single-coat; 148 wash; 42 ink; 10 glaze; 12 other translucent |
| Platforms | Android 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.
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:
| R | G | B | |
|---|---|---|---|
| X | 0.4124564 | 0.3575761 | 0.1804375 |
| Y | 0.2126729 | 0.7151522 | 0.0721750 |
| Z | 0.0193339 | 0.1191920 | 0.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:
| Family | Classification rule | Snapshot count |
|---|---|---|
| Opaque | Standard-pool colour, base, or layer records | 2,154 |
| Metallic | Metallic finish | 274 |
| Single-coat | Contrast or Speedpaint type, or line/type text containing Contrast, Speedpaint, or Xpress | 301 |
| Wash | Wash type, or line/type text containing wash or shade | 148 |
| Ink | Ink type, or line/type text containing ink | 42 |
| Glaze | Glaze type, or line/type text containing glaze | 10 |
| Other translucent | Remaining translucent records not assigned above | 12 |
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.
| ΔE2000 | BrushForge label | Interpretation |
|---|---|---|
| 0 | Same recorded color value | Stored inputs match; physical paint is not proven identical |
| >0–2 | Very close color match | Usually difficult to distinguish under comparable conditions |
| >2–5 | Close color match | Useful substitution shortlist |
| >5–10 | Noticeable difference | Inspect swatches and use case carefully |
| >10 | Different color | Alternative, 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
| Date | Version | Change |
|---|---|---|
| 2026-08-02 | 1.0 | Published 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-10 | Snapshot | Current public dataset source-update date: 2,941 records across eight brands. |