dodo
Configuration
dodo is configured through a single TOML file. No GUI wizards, no hidden state. Edit the file, restart dodo, and you're done.

Introduction

By default, dodo looks for: ~/.config/dodo/config.toml

If the file doesn't exist, dodo falls back to defaults.

You can look at this complete config file for reference: config.toml.

The config is split into sections:

[ui.*]
[colors]
[rendering]
[behavior]
[llm]
[keybindings]
NOTE
Each section is independent. Remove what you don't need.

UI

Window

KeyTypeDescriptionDefault
fullscreenboolStart fullscreen.false
menubarboolShow menubar.false
startup_tabboolShow startup tab.false
window_titlestringTemplate string. {} is replaced by base file name."{} - dodo"
[ui.window]
fullscreen = false
menubar = false
startup_tab = false
window_title = "{} - dodo"

Statusbar

KeyTypeDescriptionDefault
visibleboolShow statusbar.true
paddingarrayPadding [top, right, bottom, left].[5, 5, 5, 5]
show_session_nameboolShow current session name.true
show_file_nameboolShow current file name.true
show_modeboolShow current interaction mode.true
show_page_numberboolShow current page number.true
show_progressboolShow reading progress.true
[ui.statusbar]
visible = true
padding = [ 5, 5, 5, 5 ]
show_session_name = true
show_file_name = true
show_mode = true
show_page_number = true
show_progress = true

Command Palette

KeyTypeDescriptionDefault
show_shortcutsboolDisplay keyboard shortcuts.false
heightintPalette height in pixels.400
widthintPalette width in pixels.600
[ui.command_palette]
show_shortcuts = false
height = 400
width = 600

LLM Widget

KeyTypeDescriptionDefault
visibleboolShow LLM widget by default.false
panel_widthintWidget panel width in pixels.400
[ui.llm_widget]
visible = false
panel_width = 400

Layout

KeyTypeDescriptionDefault
modestring"single", "top_to_bottom", "left_to_right""top_to_bottom"
initial_fitstring"none", "width", "height", "window""width"
auto_resizeboolFit document to window on resize.false
spacingintSpacing between pages.0
[ui.layout]
mode = "top_to_bottom"
initial_fit = "width"
auto_resize = false
spacing = 0

Zoom

KeyTypeDescriptionDefault
levelfloatDefault zoom factor.1.0
factorfloatFactor for zoom in/out.1.25
[ui.zoom]
level = 1.0
factor = 1.25

Selection

KeyTypeDescriptionDefault
drag_thresholdintDrag threshold in pixels.100
[ui.selection]
drag_threshold = 100

Scrollbars

KeyTypeDescriptionDefault
horizontalboolShow horizontal scrollbar.true
verticalboolShow vertical scrollbar.true
auto_hideboolAuto-hide scrollbars.true
search_hitsboolShow search hits on scrollbar.true
sizeintScrollbar thickness in pixels.12
hide_timeoutintTime in ms to hide when auto_hide is true.1000
[ui.scrollbars]
horizontal = true
vertical = true
auto_hide = true
search_hits = true
size = 12
hide_timeout = 1000

Markers

KeyTypeDescriptionDefault
jump_markerboolShow jump marker.true
[ui.markers]
jump_marker = true
KeyTypeDescriptionDefault
boundaryboolShow link boundary box.false
detect_urlsboolDetect and create links for URLs in text.true
url_regexstringRegex for URL detection.(see below)
[ui.links]
boundary = false
detect_urls = true
url_regex = "(https?://|www\\.)[^\\s<>()\\\"']+"
KeyTypeDescriptionDefault
sizefloatRelative scale for link hint labels.0.25
[ui.link_hints]
size = 0.25

Tabs

KeyTypeDescriptionDefault
visibleboolShow tab bar.true
auto_hideboolHide tab bar when only one tab.true
closableboolAllow closing tabs.true
movableboolAllow reordering tabs.true
elide_modestring"none", "start", "middle", "end""middle"
bar_positionstring"top", "bottom", "left", "right""top"
[ui.tabs]
visible = true
auto_hide = true
closable = true
movable = true
elide_mode = "middle"
bar_position = "top"

Outline

KeyTypeDescriptionDefault
visibleboolShow outline by default.false
panel_positionstring"left", "right""left"
typestring"overlay", "dialog", "side_panel""overlay"
panel_widthintPanel width in pixels.300
[ui.outline]
visible = false
panel_position = "left"
type = "overlay"
panel_width = 300
KeyTypeDescriptionDefault
visibleboolShow highlight search by default.false
panel_positionstring"left", "right""right"
typestring"overlay", "dialog", "side_panel""overlay"
panel_widthintPanel width in pixels.300
[ui.highlight_search]
visible = false
panel_position = "right"
type = "overlay"
panel_width = 300

Colors

All colors are RGBA hex strings.

KeyDescriptionDefault
accentAccent UI color.#3daee9FF
backgroundBackground color.#00000000
search_matchSearch match highlight.#55500033
search_indexCurrent search hit highlight.#55FF0055
link_hint_bgLink hint background.#000000FF
link_hint_fgLink hint foreground.#ea3ee9FF
selectionSelection overlay.#33000055
highlightHighlight color.#55FF0055
jump_markerJump marker indicator.#FF0000FF
annot_rectRectangle annotation color.#55FF5588
annot_popupPopup annotation background.#FFFFFFAA
[colors]
accent = "#3daee9FF"
background = "#00000000"
search_match = "#55500033"
search_index = "#55FF0055"
link_hint_bg = "#000000FF"
link_hint_fg = "#ea3ee9FF"
selection = "#33000055"
highlight = "#55FF0055"
jump_marker = "#FF0000FF"
annot_rect = "#55FF5588"
annot_popup = "#FFFFFFAA"

Rendering

KeyTypeDescriptionDefault
dpifloatBase render DPI.72.0
dprfloat or mapDevice pixel ratio (global or per-output).(see example)
cache_pagesintHow many pages to keep in cache.4
antialiasing_bitsint4=good, 8=high.8
icc_color_profileboolEnable ICC color management.true
[rendering]
dpi = 72.0
dpr = { "eDP-1" = 1.25, "DP-5" = 1.0, "DP-7" = 1.0 }
cache_pages = 4
antialiasing_bits = 8
icc_color_profile = true
DPR
Use a map if you run mixed DPI monitors. Use a single float if you don't care.

Behavior

KeyTypeDescriptionDefault
initial_modestringStartup mode."text_select_mode"
always_open_in_new_windowboolOpen files in a new window.false
remember_last_visitedboolRestore last visited file.true
page_historyintHistory depth.100
confirm_on_quitboolAsk before quitting.false
invert_modeboolInvert colors.false
auto_reloadboolAuto reload file when it changes.true
recent_filesboolTrack recent files.true
num_recent_filesintMax recent files count.25
undo_limitintUndo history size.25
synctex_editor_commandstringEditor command using %f and %l."zeditor %f:+%l"
[behavior]
initial_mode = "text_select_mode"
always_open_in_new_window = false
remember_last_visited = true
page_history = 100
confirm_on_quit = false
invert_mode = false
auto_reload = true
recent_files = true
num_recent_files = 25
undo_limit = 25
synctex_editor_command = "zeditor %f:+%l"

LLM (Optional)

Works only if dodo is compiled with LLM support.

KeyTypeDescriptionDefault
providerstringLLM backend."ollama"
modelstringProvider model name."llama3.2:3b"
max_tokensintResponse length limit.512
[llm]
provider = "ollama"
model = "llama3.2:3b"
max_tokens = 512

Keybindings

Keybindings are plain strings. Multi-key chords are supported (comma-separated).

Full shipped defaults
[keybindings]
command_palette = "Ctrl+Shift+P"
open_file = "o"
close_file = "Ctrl+w"
link_hint_visit = "f"
link_hint_copy = "Shift+F"
scroll_left = "h"
scroll_down = "j"
scroll_up = "k"
scroll_right = "l"
prev_location = "Ctrl+o"
next_page = "Shift+J"
prev_page = "Shift+K"
first_page = "g,g"
last_page = "Shift+G"
goto_page = "b"
outline = "t"
search = "/"
search_this_page = "?"
search_next = "n"
search_prev = "Shift+N"
zoom_reset = "0"
zoom_in = "="
zoom_out = "-"
tab1 = "Alt+1"
tab2 = "Alt+2"
tab3 = "Alt+3"
tab4 = "Alt+4"
tab5 = "Alt+5"
tab6 = "Alt+6"
tab7 = "Alt+7"
tab8 = "Alt+8"
tab9 = "Alt+9"
tab_next = "Ctrl+Period"
tab_prev = "Ctrl+Comma"
text_select_mode = "1"
region_select_mode = "2"
annot_rect_mode = "3"
annot_edit_mode = "4"
text_highlight_mode = "5"
annot_pen_mode = "6"
annot_popup_mode = "7"
delete = "d"
file_properties = "Ctrl+Shift+F"
invert_color = "i"
fullscreen = "F11"
fit_height = "Ctrl+Shift+H"
fit_width = "Ctrl+Shift+W"
fit_window = "Ctrl+Shift+="
auto_resize = "Ctrl+Shift+R"
toggle_menubar = "Ctrl+Shift+M"
toggle_panel = "Ctrl+Shift+B"
toggle_tabs = "Ctrl+Shift+T"
cancel_selection = "escape"
yank = "y"
about = "F12"
save = "Ctrl+S"
select_all = "Ctrl+A"
rotate_clock = ">"
rotate_anticlock = "<"
list_text_highlights = "]"
undo = "u"
redo = "Ctrl+R"
toggle_focus_mode = "Ctrl+Space"
reselect_last_selection = "g,v"
highlight_annot_search = "Alt+Shift+H"
completion_next = "Ctrl+n"
completion_prev = "Ctrl+p"
toggle_llm_widget = "Ctrl+Shift+L"
toggle_statusbar = "Ctrl+Shift+S"

Theming

Kvantum is a powerful SVG-based theme engine for Qt. It supports dark themes, custom widgets, and integrates well with Qt6. It is available in the standard repository for your distribution. Once installed, select a theme in kvantummanager and set:

export QT_STYLE_OVERRIDE=kvantum