Themes
July 22, 2026 · View on GitHub
omk can create themes. Ask it to build one for your setup.
Themes
Themes are JSON files that define colors for the TUI.
Table of Contents
Locations
OMK loads themes from:
- Built-in:
dark,light,omk-control,omk-control-grid-dark,omk-control-light,rust-forge, plus bundled Tinted schemes (catppuccin-mocha,tokyo-night-storm,kanagawa-dragon,gruvbox-dark,dracula) - Global:
~/.omk/agent/themes/*.json - Project:
.omk/themes/*.json - Packages:
themes/directories oromk.themesentries inpackage.json - Settings:
themesarray with files or directories - CLI:
--theme <path>(repeatable)
Disable discovery with --no-themes.
Selecting a Theme
Select a theme via /settings or in settings.json:
{
"theme": "my-theme"
}
On first run, omk detects your terminal background and defaults to omk-control-grid-dark on dark terminals or omk-control-light on light terminals. omk-control-grid-dark ports the OMK//CONTROL Night City TUI palette from the 0.78.8 visual console (cyan, mint, magenta, purple, amber, red, cream, muted, gray on dark/surface). The rust-forge and Tinted scheme themes are installed as additional selectable built-in themes, but they do not change the default OMK//CONTROL brand/tone.
The bundled Tinted themes are generated from tinted-theming/schemes Base24 palettes (MIT): Catppuccin Mocha, Tokyo Night Storm, Kanagawa Dragon, Gruvbox Dark, and Dracula.
The Aurora pair (omk-aurora-dark, omk-aurora-light; aliases aurora, aurora-dark, aurora-light) ships a WCAG-verified palette: body text ≥14:1 contrast, muted ≥5.7:1, and semantic colors (success/error/warning/accent) ≥4.5:1 against their backgrounds, with a stepped thinking-level color ramp (dim → muted → accent → accentSoft → magenta). Both variants share the same 51-token map so light/dark switching stays visually consistent.
Creating a Custom Theme
- Create a theme file:
mkdir -p ~/.omk/agent/themes
vim ~/.omk/agent/themes/my-theme.json
- Define the theme with all required colors (see Color Tokens):
{
"$schema": "https://raw.githubusercontent.com/dmae97/omk/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
"name": "my-theme",
"vars": {
"primary": "#00aaff",
"secondary": 242
},
"colors": {
"accent": "primary",
"border": "primary",
"borderAccent": "#00ffff",
"borderMuted": "secondary",
"success": "#00ff00",
"error": "#ff0000",
"warning": "#ffff00",
"muted": "secondary",
"dim": 240,
"text": "",
"thinkingText": "secondary",
"selectedBg": "#2d2d30",
"userMessageBg": "#2d2d30",
"userMessageText": "",
"customMessageBg": "#2d2d30",
"customMessageText": "",
"customMessageLabel": "primary",
"toolPendingBg": "#1e1e2e",
"toolSuccessBg": "#1e2e1e",
"toolErrorBg": "#2e1e1e",
"toolTitle": "primary",
"toolOutput": "",
"mdHeading": "#ffaa00",
"mdLink": "primary",
"mdLinkUrl": "secondary",
"mdCode": "#00ffff",
"mdCodeBlock": "",
"mdCodeBlockBorder": "secondary",
"mdQuote": "secondary",
"mdQuoteBorder": "secondary",
"mdHr": "secondary",
"mdListBullet": "#00ffff",
"toolDiffAdded": "#00ff00",
"toolDiffRemoved": "#ff0000",
"toolDiffContext": "secondary",
"syntaxComment": "secondary",
"syntaxKeyword": "primary",
"syntaxFunction": "#00aaff",
"syntaxVariable": "#ffaa00",
"syntaxString": "#00ff00",
"syntaxNumber": "#ff00ff",
"syntaxType": "#00aaff",
"syntaxOperator": "primary",
"syntaxPunctuation": "secondary",
"thinkingOff": "secondary",
"thinkingMinimal": "primary",
"thinkingLow": "#00aaff",
"thinkingMedium": "#00ffff",
"thinkingHigh": "#ff00ff",
"thinkingXhigh": "#ff0000",
"bashMode": "#ffaa00"
}
}
- Select the theme via
/settings.
Hot reload: When you edit the currently active custom theme file, omk reloads it automatically for immediate visual feedback.
Theme Format
{
"$schema": "https://raw.githubusercontent.com/dmae97/omk/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
"name": "my-theme",
"vars": {
"blue": "#0066cc",
"gray": 242
},
"colors": {
"accent": "blue",
"muted": "gray",
"text": "",
...
}
}
nameis required and must be unique.varsis optional. Define reusable colors here, then reference them incolors.colorsmust define all 51 required tokens.
The $schema field enables editor auto-completion and validation.
Color Tokens
Every theme must define all 51 color tokens. There are no optional colors.
Core UI (11 colors)
| Token | Purpose |
|---|---|
accent | Primary accent (logo, selected items, cursor) |
border | Normal borders |
borderAccent | Highlighted borders |
borderMuted | Subtle borders (editor) |
success | Success states |
error | Error states |
warning | Warning states |
muted | Secondary text |
dim | Tertiary text |
text | Default text (usually "") |
thinkingText | Thinking block text |
Backgrounds & Content (11 colors)
| Token | Purpose |
|---|---|
selectedBg | Selected line background |
userMessageBg | User message background |
userMessageText | User message text |
customMessageBg | Extension message background |
customMessageText | Extension message text |
customMessageLabel | Extension message label |
toolPendingBg | Tool box (pending) |
toolSuccessBg | Tool box (success) |
toolErrorBg | Tool box (error) |
toolTitle | Tool title |
toolOutput | Tool output text |
Markdown (10 colors)
| Token | Purpose |
|---|---|
mdHeading | Headings |
mdLink | Link text |
mdLinkUrl | Link URL |
mdCode | Inline code |
mdCodeBlock | Code block content |
mdCodeBlockBorder | Code block fences |
mdQuote | Blockquote text |
mdQuoteBorder | Blockquote border |
mdHr | Horizontal rule |
mdListBullet | List bullets |
Tool Diffs (3 colors)
| Token | Purpose |
|---|---|
toolDiffAdded | Added lines |
toolDiffRemoved | Removed lines |
toolDiffContext | Context lines |
Syntax Highlighting (9 colors)
| Token | Purpose |
|---|---|
syntaxComment | Comments |
syntaxKeyword | Keywords |
syntaxFunction | Function names |
syntaxVariable | Variables |
syntaxString | Strings |
syntaxNumber | Numbers |
syntaxType | Types |
syntaxOperator | Operators |
syntaxPunctuation | Punctuation |
Thinking Level Borders (6 colors)
Editor border colors indicating thinking level (visual hierarchy from subtle to prominent):
| Token | Purpose |
|---|---|
thinkingOff | Thinking off |
thinkingMinimal | Minimal thinking |
thinkingLow | Low thinking |
thinkingMedium | Medium thinking |
thinkingHigh | High thinking |
thinkingXhigh | Extra high thinking |
Bash Mode (1 color)
| Token | Purpose |
|---|---|
bashMode | Editor border in bash mode (! prefix) |
HTML Export (optional)
The export section controls colors for /export HTML output. If omitted, colors are derived from userMessageBg.
{
"export": {
"pageBg": "#18181e",
"cardBg": "#1e1e24",
"infoBg": "#3c3728"
}
}
Color Values
Four formats are supported:
| Format | Example | Description |
|---|---|---|
| Hex | "#ff0000" | 6-digit hex RGB |
| 256-color | 39 | xterm 256-color palette index (0-255) |
| Variable | "primary" | Reference to a vars entry |
| Default | "" | Terminal's default color |
256-Color Palette
0-15: Basic ANSI colors (terminal-dependent)16-231$: 6 \times 6 \times 6 \text{RGB} \text{cube} ($16 + 36×R + 6×G + Bwhere R,G,B are 0-5)232-255: Grayscale ramp
Terminal Compatibility
OMK uses 24-bit RGB colors. Most modern terminals support this (iTerm2, Kitty, WezTerm, Windows Terminal, VS Code). For older terminals with only 256-color support, omk falls back to the nearest approximation.
Check truecolor support:
echo $COLORTERM # Should output "truecolor" or "24bit"
Tips
Dark terminals: Use bright, saturated colors with higher contrast.
Light terminals: Use darker, muted colors with lower contrast.
Color harmony: Start with a base palette (Nord, Gruvbox, Tokyo Night), define it in vars, and reference consistently.
Testing: Check your theme with different message types, tool states, markdown content, and long wrapped text.
VS Code: Set terminal.integrated.minimumContrastRatio to 1 for accurate colors.
Examples
See the built-in themes: