Skip to main content

Skins

Skins demo

Chess-tui supports custom skins that let you change the look of the board and custom piece styles (the characters or art used for each piece). A skin combines a piece style with colors for the board, pieces, cursor, and highlights.

Updating the skin config from the app default

To replace your current skins.json with the built-in default (and archive your existing file):

chess-tui --update-skins

File Location

Skins and piece styles are configured in a single JSON file:

CONFIG_DIR/chess-tui/skins.json

CONFIG_DIR is typically:

  • Linux: $XDG_CONFIG_HOME or $HOME/.config
  • macOS: $HOME/Library/Application Support
  • Windows: %APPDATA% (Roaming AppData folder)

The file contains two top-level arrays: piece_styles (how pieces look) and skins (which piece style + colors to use).

Using Skins

Cycling Through Skins

  1. From the Home Menu: Go to the "Skin" item and press Space or Enter to cycle, or Left / Right arrow (or h / l).
  2. During a game: Press s to cycle through skins at any time.

Built-in Options

  • Default: Unicode chess pieces with built-in colors (no custom piece style needed).
  • ASCII: Single letters (K, Q, R, B, N, P) for maximum terminal compatibility.

Any skin in skins.json can use a piece style by name (e.g. SIMPLE, MINIMAL, or your own). If the piece style name is not found, the UI will show a fallback message.

Skin Configuration Format

The config file has two main sections:

{
"piece_styles": [ ... ],
"skins": [ ... ]
}

Skins array

Each skin entry looks like this:

{
"name": "Skin Name",
"piece_style": "SIMPLE",
"board_white_color": { "Rgb": [200, 220, 235] },
"board_black_color": { "Rgb": [100, 140, 170] },
"piece_white_color": { "Rgb": [255, 255, 255] },
"piece_black_color": { "Rgb": [25, 55, 95] },
"cursor_color": { "Rgb": [150, 200, 230] },
"selection_color": { "Rgb": [120, 180, 220] },
"last_move_color": { "Rgb": [100, 160, 200] }
}
FieldTypeDescription
namestringName shown in the skin menu
piece_stylestringName of a piece style (see below). Use "DEFAULT" for Unicode pieces, "ASCII" for letters.
board_white_colorcolorLight square color
board_black_colorcolorDark square color
piece_white_colorcolorWhite pieces color
piece_black_colorcolorBlack pieces color
cursor_colorcolorCursor highlight
selection_colorcolorSelected piece highlight
last_move_colorcolorLast move highlight

You can use piece_style or the legacy key display_mode; both refer to the same setting.

Custom Piece Styles

Piece styles define the characters or art used for each piece (king, queen, rook, bishop, knight, pawn). The app picks one of four sizes from the cell height: small, compact, extended, large. You must define all four sizes and all six pieces for each size.

Piece style structure

{
"name": "MY_STYLE",
"small": {
"bishop": "B",
"king": "K",
"knight": "N",
"pawn": "P",
"queen": "Q",
"rook": "R"
},
"compact": {
"bishop": " ▓ \n ░ \n ",
"king": " ▓ \n ▓ \n ",
"knight": " ▓ \n ▓ \n ",
"pawn": " ░ \n ░ \n ",
"queen": " ▓ \n░▓░\n ",
"rook": " ▓ \n ▓ \n ▓ "
},
"extended": { ... },
"large": { ... }
}
  • name: Unique identifier. Skins reference this (e.g. "piece_style": "MY_STYLE"). Do not use "Default" or "ASCII" for custom styles; those are reserved.
  • small, compact, extended, large: One object per size. Each object has six keys: bishop, king, knight, pawn, queen, rook.
  • Values: Plain strings. Use \n for multiple lines. The app centers the block in the cell; keep lines similar in width for best alignment.

How sizes are chosen

Size is chosen from the cell height (in lines):

Cell heightSize used
< 3 linessmall (single character)
3 linescompact (2–3 lines)
4 linesextended (3–4 lines)
5+ lineslarge (multi-line art)

So for tiny boards you get small, for big boards you get large; the others are used for in-between sizes.

Tips for custom pieces

  • Small: One character per piece (e.g. K, Q, , ). Same character is used for both colors; the skin’s piece_white_color and piece_black_color give the difference.
  • Compact / extended / large: Use \n for newlines. Align lines to the same width (e.g. with spaces) so the block centers cleanly.
  • Unicode: You can use any Unicode character (e.g. , , , ). Make sure your terminal and font support them.
  • Testing: Add one custom piece style and one skin that uses it; cycle to that skin in the app to verify. If you see “(STYLE_NAME) piece style not found”, the name in piece_style doesn’t match any piece_styles[].name.

Example: minimal custom style

One-line pieces (small only; other sizes omitted for brevity—in real config you must define all four):

{
"name": "DOTS",
"small": {
"bishop": "•",
"king": "◎",
"knight": "◉",
"pawn": "·",
"queen": "✦",
"rook": "▪"
},
"compact": { "bishop": "•", "king": "◎", "knight": "◉", "pawn": "·", "queen": "✦", "rook": "▪" },
"extended": { "bishop": "•", "king": "◎", "knight": "◉", "pawn": "·", "queen": "✦", "rook": "▪" },
"large": { "bishop": "•", "king": "◎", "knight": "◉", "pawn": "·", "queen": "✦", "rook": "▪" }
}

Then a skin that uses it:

{
"name": "Dots Board",
"piece_style": "DOTS",
"board_white_color": { "Rgb": [240, 240, 240] },
"board_black_color": { "Rgb": [80, 80, 80] },
"piece_white_color": "White",
"piece_black_color": "Black",
"cursor_color": "LightBlue",
"selection_color": "LightGreen",
"last_move_color": "LightGreen"
}

Color Formats

Named colors (string)

Use terminal color names, e.g. "White", "Black", "LightBlue", "LightGreen", "Red", "Gray", "DarkGray".

RGB (object)

"board_white_color": { "Rgb": [240, 217, 181] }

Each component is 0–255.

You will be asked to confirm. If you confirm, the current file is saved as skins_YYYY-MM-DD_HH-MM-SS.json in the same folder, and skins.json is overwritten with the default content. Use this to get a fresh piece_styles + skins template or to recover after a bad edit.

Tips for Creating Skins

  • Contrast: Use clearly different colors for board squares and pieces so pieces stay readable.
  • Piece vs board: Avoid piece colors that are too close to board_white_color or board_black_color; otherwise pieces disappear on some squares.
  • Cursor and highlights: Choose cursor and selection colors that stand out on both light and dark squares.
  • Custom piece styles: Ensure every skin’s piece_style matches a name in piece_styles, and that each piece style defines all four sizes and all six pieces.

Default skins and piece styles

The built-in default config includes:

Piece styles

  • DEFAULT: The default piece style of chess-tui, hardcoded in the program itself
  • ASCII: The ASCII piece style of chess-tui, hardcoded in the program itself
  • SIMPLE: Single letters per size (s/c/e/l style).
  • MINIMAL: Symbolic/geometric shapes (e.g. blocks and simple Unicode symbols).

Skins (examples)

  • Default, Classic: Traditional board and Unicode pieces.
  • Matrix, Neon, Midnight: Dark themes.
  • Ocean, Forest, Sunset, Retro: Themed colors; some use MINIMAL piece style.

You can add your own piece_styles and skins to skins.json; the app loads both and shows all skins in the skin menu.