Theme
The default GJC red-claw dark theme, where theme settings are persisted, how custom themes are loaded, and the terminal image-protocol controls (GJC_FORCE_IMAGE_PROTOCOL, GJC_ALLOW_SIXEL_PASSTHROUGH).
Gajae-Code (gjc) ships a themed TUI driven by JSON color tokens. Explicit user settings always win, and the default look is the GJC red-claw dark theme.
Default theme
The default dark theme is red-claw — the GJC red-claw look, with warm red accents and strong status contrast. Light-appearance terminals default to blue-crab.
Defaults from the settings schema:
| Setting | Default |
|---|---|
theme.dark | red-claw |
theme.light | blue-crab |
symbolPreset | unicode |
colorBlindMode | false |
These are persisted to the global config YAML at <agentDir>/config.yml (default ~/.gjc/agent/config.yml). Legacy flat theme: "name" is migrated to nested theme.dark / theme.light based on luminance detection.
Auto slot selection
When the theme is on auto, GJC picks the dark/light slot from terminal appearance in this order:
COLORFGBG background index (< 8 => dark, >= 8 => light).Auto mode re-evaluates the slot on terminal appearance changes, SIGWINCH, and the macOS fallback observer.
What the theme controls
The theme system drives the TUI color tokens: foreground/background, markdown styling, selector/editor/settings list adapters, the symbol preset (unicode | nerd | ascii) plus overrides, native syntax-highlighting colors, and status-line segment colors. Every colors token is required for a custom theme; export and symbols are optional.
Built-in vs custom themes
Theme lookup order:
- Built-in embedded themes (
red-claw,blue-crab,claude-code,codex,opencode, and legacy dark/light themes). - Custom theme file:
<customThemesDir>/<name>.json.
The custom themes directory defaults to ~/.gjc/agent/themes, overridden by GJC_CODING_AGENT_DIR ($GJC_CODING_AGENT_DIR/themes). Built-ins take precedence on name collision.
Bundled themes
| Theme | Best fit |
|---|---|
red-claw | Native GJC identity for dark terminals. |
blue-crab | Light terminal or OS appearance. |
claude-code | Claude Code muscle memory without leaving GJC. |
codex | A Codex-like dark workspace. |
opencode | OpenCode muscle memory in the bundled picker. |
Create a custom theme
~/.gjc/agent/themes/my-theme.json.name, optional vars, and all required colors tokens; optionally symbols and export.red-claw.The settings theme picker is confirm-only: arrow-key browsing does not change the rendered theme, so the displayed and persisted names stay aligned until you press Enter. While running interactively, edits to a custom theme file auto-reload on save; built-ins are not watched, and reload errors keep the last successfully loaded theme. A failed explicit switch falls back to the built-in dark.
Terminal image protocol
Gajae-Code renders inline images using a terminal image protocol. Detection is automatic, but you can force it with environment variables:
| Variable | Behavior |
|---|---|
GJC_FORCE_IMAGE_PROTOCOL | Forces the image protocol — kitty, iterm2/iterm, sixel, or none. |
GJC_ALLOW_SIXEL_PASSTHROUGH | Allows SIXEL passthrough when GJC_FORCE_IMAGE_PROTOCOL=sixel. |
Set GJC_FORCE_IMAGE_PROTOCOL=none to disable inline images entirely (useful over multiplexers or terminals that mishandle image escapes). GJC_ALLOW_SIXEL_PASSTHROUGH only applies when the forced protocol is sixel.
Related detection signals
These are read as runtime signals — usually set by the terminal/OS, not configured by hand:
COLORTERM,TERM,WT_SESSION— color capability (theme color mode).COLORFGBG— terminal background light/dark auto-detection.
Color mode resolves to truecolor for COLORTERM=truecolor|24bit or WT_SESSION, to 256-color for TERM in dumb/linux/empty, and otherwise to truecolor.