Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/armory3d/armorpaint/llms.txt

Use this file to discover all available pages before exploring further.

ArmorPaint lets you personalize both its visual style and its display language without restarting. Themes control every color, size, and typographic value in the UI through a single JSON file, while localization maps the interface strings to your preferred language. Both settings are managed from the Preferences dialog (Ctrl+K) — themes in the Theme tab and language in the Interface tab.

Built-in Themes

ArmorPaint ships with three pre-built themes in addition to the built-in Default theme (dark grey, defined in source).

default

The built-in dark theme generated directly from source defaults. A balanced dark grey palette suitable for long painting sessions under studio lighting.

black

A deeper dark theme with near-black backgrounds (WINDOW_BG_COL: #F05789 in 32-bit ARGB). Higher contrast between panels and the viewport, with drop-shadow effects enabled (SHADOWS: 1). Stored in black.json.

darker

A medium-dark theme with slightly lighter panel backgrounds than black. Uses the same text color family but provides softer hover and button states. Stored in darker.json.

light

A light theme with bright panel backgrounds and dark text — useful for well-lit environments or accessibility needs. Stored in light.json.

Theme File Format

Every theme is a flat JSON object. Each key corresponds to a UI property — colors are stored as 32-bit signed integers (ARGB), while size values are stored as integers in logical pixels. The following example is taken directly from black.json:
{
    "WINDOW_BG_COL": -16185079,
    "HOVER_COL": -14474461,
    "BUTTON_COL": -15461356,
    "PRESSED_COL": -16382458,
    "TEXT_COL": -1513240,
    "LABEL_COL": -3618616,
    "SEPARATOR_COL": -16514044,
    "HIGHLIGHT_COL": -14656100,
    "FONT_SIZE": 13,
    "ELEMENT_W": 100,
    "ELEMENT_H": 26,
    "ELEMENT_OFFSET": 4,
    "ARROW_SIZE": 5,
    "BUTTON_H": 24,
    "CHECK_SIZE": 16,
    "CHECK_SELECT_SIZE": 12,
    "SCROLL_W": 9,
    "SCROLL_MINI_W": 3,
    "TEXT_OFFSET": 8,
    "TAB_W": 6,
    "FILL_BUTTON_BG": 1,
    "FULL_TABS": 0,
    "SHADOWS": 1,
    "LINK_STYLE": 0,
    "VIEWPORT_COL": -16645630
}

Theme Property Reference

KeyTypeDescription
WINDOW_BG_COLcolor (ARGB i32)Main panel and window background
HOVER_COLcolorElement hover highlight background
BUTTON_COLcolorButton default background
PRESSED_COLcolorButton pressed / active background
TEXT_COLcolorPrimary text color
LABEL_COLcolorSecondary / label text color
SEPARATOR_COLcolorDivider line color
HIGHLIGHT_COLcolorSelection and accent highlight color
VIEWPORT_COLcolor3D viewport background fill color
FONT_SIZEintegerBase font size in logical pixels
ELEMENT_WintegerDefault element width in logical pixels
ELEMENT_HintegerDefault element height in logical pixels
ELEMENT_OFFSETintegerVertical gap between elements
ARROW_SIZEintegerDropdown arrow icon size
BUTTON_HintegerButton height in logical pixels
CHECK_SIZEintegerCheckbox outer box size
CHECK_SELECT_SIZEintegerCheckbox inner fill size when checked
SCROLL_WintegerScrollbar track width
SCROLL_MINI_WintegerMini scrollbar track width
TEXT_OFFSETintegerHorizontal text padding inside elements
TAB_WintegerTab header width padding
FILL_BUTTON_BGbool (0/1)Fill button backgrounds (1) or use outline style (0)
FULL_TABSbool (0/1)Stretch tabs to fill the full tab bar width
SHADOWSbool (0/1)Enable drop shadows on panels and menus
LINK_STYLEenum (0/1)Node link style: 0 = Straight, 1 = Curved
Color values use the signed 32-bit ARGB encoding. For example, fully opaque white is ‑1 (0xFFFFFFFF as a signed integer) and fully opaque black is ‑16777216 (0xFF000000). When editing a theme in the Theme tab, ArmorPaint displays a colour wheel picker for any field ending in _COL.

Custom Themes

1

Create a new theme

In Preferences → Theme, click New. Enter a name (e.g. my_theme) and click OK. ArmorPaint duplicates the current active theme into a new JSON file inside the themes/ data folder and switches to it immediately.
2

Edit color and size values

Every theme field is listed in the Theme tab. Click a colored swatch next to any _COL field to open an inline color wheel. For numeric fields, click the field and type a new value. Changes are reflected in the UI in real time.
3

Export the theme file

Click Export to save the theme JSON to any location on disk. This is useful for sharing themes or keeping version-controlled backups.
4

Import an existing theme

Click Import to load a .json theme file from disk. The file is copied into the themes/ data folder and immediately becomes available in the Theme dropdown.
Theme files are stored in the themes/ subfolder of the ArmorPaint data directory. You can place manually crafted JSON files there and they will appear in the Theme dropdown the next time the Preferences dialog is opened.

Supported Languages

ArmorPaint ships with locale files for 14 languages in addition to the default English source strings. Locale files are stored in paint/assets/locale/.
CodeLanguage
enEnglish (default — source strings, no file needed)
csCzech
deGerman
elGreek
esSpanish
frFrench
huHungarian
idIndonesian
jaJapanese
koKorean
plPolish
ptPortuguese
ruRussian
zh_cnChinese (Simplified)
Additionally, system is a special pseudo-locale that instructs ArmorPaint to detect and use the operating system language at startup.

Locale Configuration

The active locale is stored as the locale field in config.json and can be changed at any time from Preferences → Interface → Language without restarting.
Select a language from the Language dropdown in Preferences → Interface. The UI is re-translated immediately using the matching <code>.json file from the locale/ folder.The underlying config value is an ISO 639-1 language code, optionally with a region suffix (e.g. zh_cn):
{
  "locale": "de"
}
Using "system" as the locale value tells ArmorPaint to auto-detect the OS language on every launch. If you want to pin a language regardless of OS settings, set the code explicitly (e.g. "fr").

Locale File Format

Each locale file is a flat JSON object mapping English source strings to their translated equivalents.
{
    "2D View": "2D Ansicht",
    "3D View": "3D Ansicht",
    "About": "Über",
    "Add": "Hinzufügen",
    "Brush Radius": "Pinselgröße"
}
Newline characters in source strings are encoded as \n in both the key and the value. Placeholder variables use the {variable_name} format.

Generating New Locale Files

To create a translation file for a new language, run the locale extraction script from the repository root:
./base/make --js base/tools/extract_locales.js <locale_code>
# Generates paint/assets/locale/<locale_code>.json
This scans all source files for translatable strings (those wrapped in tr() calls) and writes a JSON skeleton with the English source strings as both keys and values. Replace the values with the target-language translations to complete the locale file. Example — generating a Turkish locale:
./base/make --js base/tools/extract_locales.js tr
# Creates: paint/assets/locale/tr.json
Locale files are plain JSON and can be edited in any text editor. If you produce a translation for a language not yet in the repository, consider opening a pull request on GitHub — community-contributed translations are welcome!

Build docs developers (and LLMs) love