Skip to main content
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:
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. 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:
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 #:
These keys change what you see: 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: 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. 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:
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.
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.

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:
Restart o4 for changes to take effect.

Keys you can use

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.

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. 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.