> ## Documentation Index
> Fetch the complete documentation index at: https://docs.open4rena.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Themes and display

> Change o4's theme, key bindings, and display options.

You can change how o4 looks and which keys trigger its actions. Most of these
settings are in two tabs of the settings panel: **Appearance** for the theme
and display options, and **Keys** for Vim mode and key bindings. Changes you
make there are saved for every future session.

## Open the settings

Run `/config` with the name of the tab you want:

```text theme={null}
/config appearance
```

```text theme={null}
/config keys
```

Move to a row with `Up` and `Down`, and press `Enter` to change it. Most rows
switch between `on` and `off`; the **Theme** row moves to the next theme.
Press `Tab` to switch tabs, and `Esc` to close the panel. Each change is saved
as soon as you make it.

## Themes

Choose a theme with the **Theme** row in `/config appearance`. Each press of
`Enter` moves to the next theme and applies it at once, so you can see it
before you close the panel. The rows under **Preview** are sample labels for a
user message, a reply and two status markers. In 0.2.74 they use the panel's
normal text color, so they don't show the theme's message or status colors.

| Theme | Description |
| - | - |
| `auto` | The default. Uses your terminal's own foreground and background colors, and picks light or dark colors for the rest to match. |
| `terminal` | The same as `auto`. If your terminal doesn't report its colors, o4 guesses light or dark from environment variables instead; see below. |
| `dark`, `light` | o4's own dark and light themes. |
| `dark-daltonized`, `light-daltonized` | Dark and light themes for color-blind users. |
| `dark-ansi`, `light-ansi` | Use only the 16 standard terminal colors, for terminals with limited color support. |
| `catppuccin-mocha`, `catppuccin-latte`, `dracula`, `nord`, `gruvbox-dark`, `gruvbox-light`, `tokyo-night`, `solarized-dark`, `solarized-light`, `kanagawa`, `everforest`, `one-dark`, `monokai`, `ayu-dark`, `nightfox`, `rose-pine`, `rose-pine-moon`, `material-palenight` | Themes based on popular editor color schemes. |

The setup wizard offers a shorter list: Dark, Light, Catppuccin Mocha,
Dracula, Nord, and Rosé Pine.

o4 saves the theme as `theme` in `~/.o4/settings.json`. You can also set it
there by hand:

```json theme={null}
{
  "theme": "tokyo-night"
}
```

An unknown theme name falls back to `dark`.

With `auto`, o4 asks the terminal for its colors when it starts. If the
terminal doesn't answer, o4 guesses light or dark from, in order:
`COLORFGBG` (a background color number of 8 or more means light), the
terminal named in `TERM_PROGRAM` (Apple Terminal is judged from `TERM`,
iTerm2 and Ghostty count as dark), a `TERM` value that contains `light` or
`dark`, and in the VS Code terminal, a `VSCODE_THEME` that contains `light`.
Otherwise it uses dark colors. If the guess is wrong, pick `light` or `dark`
yourself.

### Terminal colors

o4 uses full 24-bit color only when your terminal says it supports it, through
`COLORTERM=truecolor` or `COLORTERM=24bit`. Otherwise it uses the 256-color
palette when `TERM` contains `256color`, and the 16 standard colors if not.
If a theme's colors look wrong, check that `COLORTERM` is set in the terminal
you start o4 from.

### Customize theme colors

To change individual colors, create `~/.o4/theme.toml`. Its values override
the theme you selected; colors you don't set keep the theme's values. Colors
are six-digit hex values, with or without a leading `#`:

```toml theme={null}
accent = "#5B9BD5"
fg_dim = "#8A8F98"
code_bg = "#1E2127"
```

These keys change what you see:

| Key | Colors |
| - | - |
| `fg` | Most text, including your messages. |
| `fg_dim` | Dimmed text, such as hints, the `>` before your messages, and the marker before each reply. |
| `text_primary` | The model's replies in the transcript, and titles and other main text in panes, pickers and the agents dashboard. |
| `text_secondary` | The model's reasoning when **Thinking display** is on, and secondary details in panes and the session picker. |
| `text_disabled` | Rows in panes that have no action, such as a plugin on the **Discover** tab that's already installed. |
| `text_inverse` | Text on filled labels, such as transcript search matches and the selected image above the prompt. |
| `accent` | Highlights, such as the prompt's `>`, selected items, focused action chips and the spinner. |
| `accent_shimmer` | The second color of the animated spinner. |
| `assistant_message_fg` | Headings and details in the approval panel, and the pulsing cursor at the end of a reply while it streams. |
| `success`, `warning`, `error` | Status colors. `success` and `error` also color added and removed lines in the `/diff` view, and `warning` is the background of transcript search matches. |
| `info` | Image labels above the prompt, and one of the spinner's colors. |
| `diff_added`, `diff_removed` | The background of added and removed lines in the change previews that `edit` and `write` show in the transcript. |
| `bubble_border` | The border of those change previews, and the brackets around action chips. |
| `code_bg`, `code_fg` | Code blocks: `code_bg` is their background, and `code_fg` colors the language label and code blocks that don't name a language. |
| `syntect_theme` | The highlighting theme for code. See below. |
| `border` | Borders of dialogs, code blocks, the completion list, and question cards in the transcript, such as a question from the model. |
| `bar_border` | Borders and dividers in panes, the session picker and the agents dashboard. |
| `bg_panel` | The background of panes, dialogs, the completion list and notices. |
| `bg_selection`, `bg_panel_hover` | The selected row in panes, the agents dashboard, the agent and task selector, the session picker, and the directory question o4 asks when you resume a session. In panes, o4 uses `bg_panel_hover` instead when `bg_selection` is too close to `bg_panel`. |
| `selection_bg`, `selection_fg` | The selected entry in the completion list and the Time Machine, the block under the cursor in Navigation Mode, and text you select in the transcript. `selection_fg` also colors the text of the selected row in panes, the session picker and the resume directory question, and the selected answer in a question card. |
| `bg` | The background of the side chat (`/hey`), the rows of the agent and task selector, and a few other areas. o4 doesn't fill the rest of the screen, so it keeps your terminal's background. |
| `input_border`, `input_border_focused` | The prompt box's border, and its border while the prompt has focus. |
| `input_fg`, `placeholder` | In the prompt box: the text you type while it has focus, and the `Type a message...` placeholder. |
| `cursor` | The cursor in the prompt box and in a question card's **Other** answer, and the cursor at the end of a streaming reply when **Animations** is off or an approval is waiting. |
| `scrollbar_track`, `scrollbar_thumb` | The transcript's scrollbar when **Scrollbar** is on. The thumb uses `accent` while the view follows new output. |
| `scrim` | The color the screen behind a dialog is dimmed toward, and the color notices fade toward as they disappear. |
| `shadow` | The shadow beside a dialog. |

`syntect_theme` takes one of `base16-ocean.dark`, `base16-eighties.dark`,
`base16-mocha.dark`, `base16-ocean.light`, `InspiredGitHub`,
`Solarized (dark)` or `Solarized (light)`. It applies to code blocks and to the
change previews of `edit` and `write`. An unknown name falls back to
`InspiredGitHub` when the theme's `bg` is a light color, and to
`base16-ocean.dark` otherwise. The `auto` and `terminal` themes leave `bg` to
your terminal, and `light-ansi` uses a basic terminal color. o4 counts both as
dark here, so these themes fall back to `base16-ocean.dark` unless you set a
light `bg` in `theme.toml`.

The other keys are accepted, but in 0.2.74 they change little or nothing:

* `base` is ignored. The theme you select is always the starting point.
* Your messages use `fg`, so `user_message_fg` only colors code blocks in them
  that name a language but aren't highlighted, for example with
  **Syntax highlight** off.
* The transcript and the Transcript Reader show headings, links and inline
  code in the normal text color, so `heading1`, `heading2`, `heading3`, `link`
  and `link_style` have no effect.
* These keys aren't used: `brand`, `brand_shimmer`, `brand_secondary`,
  `brand_secondary_shimmer`, `system_message_fg`, `border_focused`,
  `border_shimmer`, `border_focused_shimmer`, `bg_input`, `bg_cursor`,
  `success_shimmer`, `error_shimmer`, `warning_shimmer`, `info_shimmer`,
  `merged`, `merged_shimmer`, `diff_added_dimmed`, `diff_removed_dimmed`,
  `link_visited`, `bubble_bg_user`, `bubble_bg_user_hover`,
  `bubble_bg_assistant`, `bubble_bg_assistant_hover`, `bubble_bg_system`,
  `bubble_bg_system_hover`, `scrollbar_thumb_hover`, `input_placeholder`,
  `input_cursor`, `agent_red`, `agent_blue`, `agent_green`, `agent_yellow`,
  `agent_purple`, `agent_orange`, `agent_pink`, `agent_cyan`,
  `rate_limit_fill`, `rate_limit_empty`, `fast_mode`, `fast_mode_shimmer`,
  `brief_label_you` and `brief_label_assistant`.

o4 watches `theme.toml` while it runs, so your changes appear as soon as you
save the file. If the file can't be read or has an error, such as an invalid
color or a key o4 doesn't know, o4 keeps the current colors and shows a
`Theme reload error` notice. At startup, o4 ignores a file with an error and
starts with the selected theme's own colors, after writing
`Warning: Failed to load theme file` and the reason to standard error. The file
can be at most 64 KB.

## Display options

These rows are in `/config appearance`:

| Setting | What it does | Default |
| - | - | - |
| **Timestamps** | Meant to show the time next to each message. In 0.2.74 o4 saves this setting but doesn't show timestamps in the transcript either way. | on |
| **Nerd fonts** | Use Nerd Font icons. Turn this off if icons show as boxes or question marks. The setup wizard's **Nerd Font icons** row starts at `off`, so it's off if you finished the wizard without changing it. | on |
| **Scrollbar** | Show a scrollbar when the transcript is longer than the screen. | off |
| **Syntax highlight** | Color code blocks in messages. | on |
| **Action chips** | Show quick actions after the model's reply, such as **Run Tests**, **View Diff**, and **Undo** (see [The Undo chip](/guides/checkpoints#the-undo-chip)). | on |
| **File watcher** | Watch the workspace for file changes made outside o4. In 0.2.74 this has no visible effect; turn it off if watching fails on your system. Takes effect after a restart. | on |
| **Animations** | Animate the spinner and other live effects. | on |
| **Reduce motion** | Turn off animations and transitions. Turning it on also turns **Animations** off, and while it's on, **Animations** starts off in every session. | off |
| **Screen reader** | Show plain text in place of animation, box drawing, and icons, so a screen reader reads the screen cleanly. See [Screen reader mode](#screen-reader-mode). | off |

The **Thinking display** row in `/config reasoning` controls whether the
model's thinking is shown when the model provides it. See
[Reasoning and prompt profiles](/models/reasoning).

o4 stores these settings in two files in `~/.o4`:

* `settings.json` holds **Nerd fonts** (`nerd_fonts`), **Scrollbar**
  (`scrollbar`), **Syntax highlight** (`syntax_highlighting_disabled`, which
  is `true` when highlighting is off), **Action chips** (`show_action_chips`),
  **File watcher** (`show_file_watcher`), and **Reduce motion**
  (`reduce_motion`).
* `display.json` holds **Timestamps** (`show_timestamps`), **Animations**
  (`animations`), **Screen reader** (`screen_reader`), and **Thinking
  display** (`show_thinking`).

### Screen reader mode

Screen reader mode makes the interface easier for a screen reader to read. The
**Screen reader** row turns it on and off right away. It changes the display
like this:

* Nothing animates. The spinners and the fade and slide effects stop, and a
  running step shows the text `[*]` in place of a spinner. While
  **Animations** is on, the welcome logo and the hint line under it don't
  appear at all.
* Messages in the transcript start with a plain `You:` label instead of a
  colored bar or box.
* Dialogs use `+`, `-`, and `|` for their borders. Tool calls, the Time
  Machine, and the agents dashboard use plain ASCII text instead of box
  drawing, and a running tool call says `running`. Diffs are listed as lines
  that start with `+` and `-`.
* The model icon before the model name in the footer is removed, and
  "need input" counts appear as plain text.
* Status changes of sub-agents, such as one that needs your approval or
  fails, are announced as short notices.

To turn screen reader mode on for a single session, start o4 with
`--accessibility`:

```bash theme={null}
o4 --accessibility
```

The flag doesn't change your saved setting by itself. But if you change any
row that `display.json` holds while the flag is on, o4 saves
`screen_reader` as `true`, and screen reader mode stays on in later sessions
until you turn the **Screen reader** row off.

## Vim mode

The **Vim mode** row on the **Keys** tab of `/config keys` turns on Vim-style
modal editing in the prompt. The setup wizard offers the same choice. It's off
by default. o4 saves it as `vim_mode` in `~/.o4/settings.json`.

<Warning>
  In o4 0.2.74, turning on Vim mode doesn't change how the main prompt
  behaves. `Esc` in the prompt still switches to Navigation Mode, so the
  prompt's Vim normal mode can't be reached.
</Warning>

## Change key bindings

Some of o4's actions can be moved to different keys. To see the current keys,
open `/config keys` and choose **Current keybindings**. The **Bindings** pane
lists every action you can remap with the key it's bound to, or `unbound`.
For `cycle_model`, `cycle_reasoning`, `cycle_approval`, and
`cycle_sandbox_tier`, it also shows the current value, for example
`alt-s · guarded`. Press `Esc` to close the pane.

To change a binding, add a `[keybindings]` table to `~/.o4/config.toml`. Each
line maps an action name to a key:

```toml theme={null}
[keybindings]
toggle_todo_list = "f2"
toggle_time_machine = "alt-h"
open_transcript_reader = "f3"
```

Restart o4 for changes to take effect.

### Keys you can use

| Key form | Example |
| - | - |
| `alt-` and one character | `alt-h`, `alt-/` |
| `shift-tab` | `shift-tab` |
| Function keys | `f1` through `f12` |
| `ctrl-t` | `ctrl-t` |

Other `ctrl-` keys are reserved for o4's built-in shortcuts. Arrow keys and
plain letters can't be remapped either.

When you bind an action to a new key, its old key stops working. If the new
key was used by another action, it now belongs to the action you bound it
to. If o4 can't use a line, for example an unknown action name or a reserved
key, it shows a warning when it starts and keeps the default for that
action.

In a trusted project, `[keybindings]` in the project's `.o4/config.toml` or
`.o4/config.local.toml` also applies, and wins over your own file for the
actions it sets. See [Workspace trust](/safety/workspace-trust).

### Actions you can remap

Default keys are written the way you'd write them in `config.toml`, which is
also how the **Bindings** pane shows them.

| Action | Default key | What it does |
| - | - | - |
| `cycle_reasoning` | `alt-r` | Switch to the next reasoning level. |
| `steer_current_task` | `alt-e` | Send the prompt as steering for the running turn. |
| `edit_last_queued` | `alt-q` | Pull the last queued message back into the prompt. |
| `resume_queue` | `alt-g` | Resume a held message queue. |
| `cycle_approval` | `alt-a` | Switch to the next approval mode. |
| `toggle_plan_mode` | `shift-tab` | Turn Plan Mode on or off. |
| `new_tab` | `alt-n` | Open a new session tab. |
| `close_tab` | `alt-w` | Close the current tab. |
| `next_tab` | `alt-j` | Switch to the next tab. |
| `prev_tab` | `alt-k` | Switch to the previous tab. |
| `cycle_model` | `alt-m` | Switch to the next model. |
| `undo_last_change` | `alt-u` | Undo the last file change. |
| `toggle_diff_pane` | `alt-d` | Open Session Diff. |
| `toggle_radar_pane` | `alt-t` | Open or close Workspace Radar. |
| `toggle_task_board` | `alt-b` | Open or close the task board. |
| `toggle_todo_list` | `alt-l` | Open or close the todo list. |
| `open_transcript_reader` | `ctrl-t` | Open the Transcript Reader. |
| `toggle_time_machine` | None | Open or close the Time Machine sidebar. |
| `cycle_sandbox_tier` | `alt-s` | Switch to the next sandbox tier. |
| `repeat_with_correction` | `alt-.` | Put your last prompt back in the input so you can correct it. |
| `panic_pause` | `alt-x` | Pause all running work, or resume it. |
| `approve_pending` | `alt-y` | Approve the waiting approval. |
| `deny_pending` | `alt-z` | Deny the waiting approval. |

Keys that aren't in this table, such as the Navigation Mode letters and the
keys inside dialogs, can't be changed. For every key, see
[Keyboard shortcuts](/reference/keyboard-shortcuts).
