Open the settings
Run/config with the name of the tab you want:
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:
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, throughCOLORTERM=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 #:
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:
baseis ignored. The theme you select is always the starting point.- Your messages use
fg, souser_message_fgonly 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,linkandlink_stylehave 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_youandbrief_label_assistant.
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.jsonholds Nerd fonts (nerd_fonts), Scrollbar (scrollbar), Syntax highlight (syntax_highlighting_disabled, which istruewhen highlighting is off), Action chips (show_action_chips), File watcher (show_file_watcher), and Reduce motion (reduce_motion).display.jsonholds 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 saysrunning. 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.
--accessibility:
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.
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:
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 inconfig.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.