33 brands · 11,609 paints
This is a collection of hobby/miniature painting paints from some of the most popular brands around the world.
I forked the original repo from Arcturus5404/miniature-paints, who had made a significant amount of progress, but has not updated the repo in several years. I needed a clean and up to date dataset for my own paint/supplies inventory app.
The original paint list was scraped by Arcturus5404 from the Miniature Painter Pro team.
Feel free to use or improve any of these paints in your own personal projects. This repo will remain free for you to use in your projects, all I ask is a credit.
Unless otherwise stated, the RGB/Hex values for all paints are an approximation, as most manufacturers hold the spectral info secret. For the most part, the values have been sampled from product images either from the brands website or product catalogue.
I have yet to decide how to handle discontinued paints. It's a tricky one.
I own paints that are now discontinued from Warhammer for example, but for brands I have not yet had the chance to use, I have no real idea what paints they have stopped making.
This requires more thought on my part, but if you have ideas I'd be happy to hear them.
- Add contact information for each brand where possible
- Update all paint sets to match the current product catalogues
- AK
- Acrilex
- Apple Barrel
- Army Painter
- Arteza
- Coat D'Armes
- Creature Caster
- Duncan Rhodes' Two Thin Coats
- Golden
- Green Stuff World
- Humbrol
- Italeri
- Kimera Kolors
- Liquitex
- Mig
- Mission Models
- Monument Hobbies
- Mr Hobby
- Mr Paint
- P3
- Pantone
- RAL
- Reaper
- Revell
- Scale75
- Tamiya
- Tom Color
- Turbo Dork
- Vallejo
- Warcolours
- Warhammer Colour
The paints/markdown/*.md tables are the single source of truth; everything below is generated from them by scripts/build_paints.py. The aggregate paints.json lives at the root of the /paints directory, and the per-brand files live in paints/json/. See paints/README.md for a per-brand index.
Every output file is described by a formal JSON Schema (Draft 2020-12) under schema/: schema/paints.schema.json for the aggregate and schema/brand.schema.json for the per-brand files. Each data file links to its schema via a relative $schema reference, so editors like VS Code validate it automatically.
The per-brand files paints/json/<stem>.json each contain a single brand object (without the brandCount/brands wrapper). Each one is prefixed with its own $schema and schema keys so the file is self-identifying; the brand objects embedded under brands in paints.json omit those two keys (the aggregate already carries them).
{
"$schema": "../../schema/brand.schema.json", // standalone files only
"schema": "miniature-paints/v3", // standalone files only
"displayName": "Acrilex",
"company": "Acrilex Tintas Especiais S.A.",
"address": { "street": "", "city": "", "postcode": "", "country": "" },
"contactEmail": "...",
"contactForm": "...",
"website": "...",
"phone": "...",
"updatedCatalogueRequested": "25/06/2026", // string, may be ""
"paintCount": 95,
"paints": [ /* paint objects */ ]
}{
"id": "acrilex-831", // string, unique within a brand: "<brand-slug>-<code|name-slug>"
"name": "Almond", // string
"code": "831", // string | null (null for brands with no code column)
"set": "Acrilex Paints", // string | null
"hex": "#D97037", // string | null — single colour (null for colour-shift paints)
"rgb": { "r": 217, "g": 112, "b": 55 }, // object | null (r/g/b are integers)
"shiftColors": null, // string[] | null — ordered hex stops for colour-shift paints
"potSizes": [ // object[] | null
{ "raw": "37ml", "value": 37, "unit": "ml" },
{ "raw": "60ml", "value": 60, "unit": "ml" },
{ "raw": "250ml", "value": 250, "unit": "ml" }
],
"description": null // string | null
}hexandshiftColorsare mutually exclusive: a normal paint hashexset andshiftColors: null; a colour-shift paint hashex: nullandshiftColorsas an array of hex stops.rgbisnullif any of R/G/B is missing or non-numeric in the source table.potSizesis an array when one or more sizes are known, ornullwhen no size is recorded. Each entry is{ raw, value, unit }; if a size string can't be parsed,value/unitarenullbutrawis preserved. Single-size brands are 1-element arrays.
Note
The schema field is versioned. v3 renamed the former singular potSize object to the potSizes array — consumers reading pot sizes should expect an array (or null).
❤️ A huge thank you to Greg over at Turbo Dork for supplying an up to date list of their products in an easy to use spreadsheet, and for their permission and support to include their paints here. Your help is very much appreciated.
❤️ A huge thank you to Jesper over at The Army Painter for providing me with an up to date spreadsheet of all their current paints and sets. Thank you for your support.
Note
I am not affiliated in any way with the Miniature Painter Pro team or app, nor am I affiliated with any of the brands shared here.
Note
There's a lot of paints! Tens of thousands of them! I have been feeding the latest product catalogues into Claude and asking it to pull out all the paints and the sets they belong to. After I process and verify the output, Claude then updates the tables in the markdown files. AI can make mistakes, and so can I, so there may be errors. I verify as much as possible, but if a mistake slips through feel free to open a PR and I'll correct it.
There's still an awful lot of legwork involved. Claude is basically my unpaid intern.

































{ "$schema": "../schema/paints.schema.json", // relative link to the schema "schema": "miniature-paints/v3", // version tag "brandCount": 33, "paintCount": 11812, "brands": { "AK": { /* brand object */ }, // keyed by file stem (paints/<stem>.md) "Acrilex": { /* brand object */ }, // ... } }