v0.13.0 976176a

CONFIG.md RawHistoryFolder

Configuration Reference

Primary format: JSON Location: ~/.config/dumber/config.json Also supports: YAML (.yaml) and TOML (.toml) JSON Schema: ~/.config/dumber/config.schema.json (auto-generated)

IDE Integration

For autocompletion and validation in VS Code or other editors, add this to the top of your config.json:

{
  "$schema": "./config.schema.json",
  "default_zoom": 1.2,
  ...
}

The schema is automatically generated when you first create a config file.

Database

Key Type Default Description
database.path string ~/.local/state/dumber/dumber.sqlite Database file path

History

Key Type Default Valid Values Description
history.max_entries int 10000 > 0 Maximum number of history entries
history.retention_period_days int 365 > 0 Days to keep history (1 year)
history.cleanup_interval_days int 1 > 0 How often to run cleanup

Search Shortcuts

Key Type Default Description
search_shortcuts map See defaults Map of shortcut aliases to URLs

Default shortcuts:

{
  "search_shortcuts": {
    "g": {
      "url": "https://google.com/search?q=%s",
      "description": "Google Search"
    },
    "gh": {
      "url": "https://github.com/search?q=%s",
      "description": "GitHub"
    },
    "yt": {
      "url": "https://youtube.com/results?search_query=%s",
      "description": "YouTube"
    }
  }
}

Dmenu / Launcher

Key Type Default Description
dmenu.max_history_items int 20 Max items shown in launcher
dmenu.show_visit_count bool true Show visit counts
dmenu.show_last_visited bool true Show last visited dates
dmenu.history_prefix string "🕒" Prefix for history items
dmenu.shortcut_prefix string "🔍" Prefix for shortcuts
dmenu.url_prefix string "🌐" Prefix for URLs
dmenu.date_format string "2006-01-02 15:04" Go time format string
dmenu.sort_by_visit_count bool true Sort by popularity

Logging

Key Type Default Valid Values Description
logging.level string "info" debug, info, warn, error Log level
logging.format string "text" text, json Log format
logging.filename string "" any Empty = stdout
logging.max_size int 100 > 0 Max log size in MB
logging.max_backups int 3 >= 0 Number of log backups
logging.max_age int 7 >= 0 Days to keep logs
logging.compress bool true - Compress old logs
logging.log_dir string ~/.local/state/dumber/logs/ any Log directory
logging.enable_file_log bool true - Enable file logging
logging.capture_stdout bool false - Capture stdout to log
logging.capture_stderr bool false - Capture stderr to log
logging.capture_c_output bool false - Capture C/CGO output
logging.capture_console bool false - Capture browser console
logging.debug_file string "debug.log" any Debug log filename
logging.verbose_webkit bool false - Verbose WebKit logs

Appearance

Key Type Default Description
appearance.sans_font string "Fira Sans" Sans-serif font
appearance.serif_font string "Fira Sans" Serif font
appearance.monospace_font string "Fira Code" Monospace font
appearance.default_font_size int 16 Font size in points
appearance.color_scheme string "default" prefer-dark, prefer-light, default

Color Palettes

Light palette:

{
  "appearance": {
    "light_palette": {
      "background": "#f8f8f8",
      "surface": "#f2f2f2",
      "surface_variant": "#ececec",
      "text": "#1a1a1a",
      "muted": "#6e6e6e",
      "accent": "#404040",
      "border": "#d2d2d2"
    }
  }
}

Dark palette:

{
  "appearance": {
    "dark_palette": {
      "background": "#0e0e0e",
      "surface": "#1a1a1a",
      "surface_variant": "#141414",
      "text": "#e4e4e4",
      "muted": "#848484",
      "accent": "#a8a8a8",
      "border": "#363636"
    }
  }
}

Video Acceleration

Key Type Default Description
video_acceleration.enable_vaapi bool true Enable VA-API hardware accel
video_acceleration.auto_detect_gpu bool true Auto-detect GPU driver
video_acceleration.vaapi_driver_name string "" Driver name (auto-detected)
video_acceleration.enable_all_drivers bool true Enable all VA-API drivers
video_acceleration.legacy_vaapi bool false Legacy VA-API mode

Codec Preferences

Key Type Default Valid Values Description
codec_preferences.preferred_codecs string "av1,h264" Comma-separated Codec priority order
codec_preferences.force_av1 bool false - Force AV1 codec
codec_preferences.block_vp9 bool false - Block VP9 codec
codec_preferences.block_vp8 bool true - Block VP8 codec
codec_preferences.av1_hardware_only bool false - Disable AV1 software fallback
codec_preferences.disable_vp9_hardware bool false - Disable VP9 hardware accel
codec_preferences.video_buffer_size_mb int 16 > 0 Video buffer size in MB
codec_preferences.queue_buffer_time_sec int 10 > 0 Queue buffer time in seconds
codec_preferences.custom_user_agent string Chrome UA any Custom user agent string
codec_preferences.av1_max_resolution string "1080p" 720p, 1080p, 1440p, 4k, unlimited Max AV1 resolution
codec_preferences.disable_twitch_codec_control bool true - Disable codec control on Twitch

Debug Options

Key Type Default Description
debug.enable_webkit_debug bool false Enable WebKit debug logs
debug.webkit_debug_categories string "Network:preconnectTo,ContentFilters" Debug categories
debug.enable_filtering_debug bool false Content filter debug
debug.enable_webview_debug bool false WebView state debug
debug.log_webkit_crashes bool true Log WebKit crashes
debug.enable_script_debug bool false Script injection debug
debug.enable_general_debug bool false General debug mode
debug.enable_workspace_debug bool false Workspace navigation debug
debug.enable_focus_debug bool false Focus state debug
debug.enable_css_debug bool false CSS reconciler debug
debug.enable_focus_metrics bool false Focus metrics tracking
debug.enable_pane_close_debug bool false Pane close debug

Rendering & Zoom

Key Type Default Valid Values Description
rendering_mode string "gpu" auto, gpu, cpu Rendering mode
use_dom_zoom bool false - Use DOM-based zoom
default_zoom float 1.2 > 0 Default zoom level (120%)

Workspace Configuration

Key Type Default Description
workspace.enable_zellij_controls bool true Enable Zellij-style keybindings

Pane Mode

Key Type Default Description
workspace.pane_mode.activation_shortcut string "ctrl+p" Pane mode activation key
workspace.pane_mode.timeout_ms int 3000 Pane mode timeout (ms)
workspace.pane_mode.action_bindings map See below Pane mode key bindings

Default pane mode bindings:

{
  "workspace": {
    "pane_mode": {
      "action_bindings": {
        "arrowright": "split-right",
        "arrowleft": "split-left",
        "arrowup": "split-up",
        "arrowdown": "split-down",
        "r": "split-right",
        "l": "split-left",
        "u": "split-up",
        "d": "split-down",
        "x": "close-pane",
        "enter": "confirm",
        "escape": "cancel"
      }
    }
  }
}

Tab Shortcuts

Key Type Default Description
workspace.tabs.new_tab string "ctrl+t" New tab shortcut
workspace.tabs.close_tab string "ctrl+w" Close tab shortcut
workspace.tabs.next_tab string "ctrl+tab" Next tab shortcut
workspace.tabs.previous_tab string "ctrl+shift+tab" Previous tab shortcut

Popup Behavior

Key Type Default Valid Values Description
workspace.popups.behavior string "split" split, stacked, tabbed, windowed Popup opening mode
workspace.popups.placement string "right" right, left, top, bottom Split direction
workspace.popups.open_in_new_pane bool true - Open popups in workspace
workspace.popups.follow_pane_context bool true - Follow parent pane context
workspace.popups.blank_target_behavior string "pane" pane, tab _blank target handling
workspace.popups.enable_smart_detection bool true - Use WindowProperties for detection
workspace.popups.oauth_auto_close bool true - Auto-close OAuth popups

Workspace Styling

Key Type Default Description
workspace.styling.border_width int 2 Border width in pixels
workspace.styling.border_color string "@theme_selected_bg_color" Border color (CSS or theme var)
workspace.styling.pane_mode_border_color string "#FFA500" Pane mode border color (orange)
workspace.styling.transition_duration int 120 Transition duration (ms)
workspace.styling.border_radius int 0 Border radius in pixels

Content Filtering

Key Type Default Description
content_filtering_whitelist array See below Domains to skip ad blocking

Default whitelist:

{
  "content_filtering_whitelist": [
    "twitch.tv",
    "passport.twitch.tv",
    "gql.twitch.tv"
  ]
}

Environment Variables

All config values can be overridden via environment variables with the prefix DUMB_BROWSER_:

# Database
DUMB_BROWSER_DATABASE_PATH=/custom/path/db.sqlite

# Rendering
DUMBER_RENDERING_MODE=cpu
DUMBER_DEFAULT_ZOOM=1.5

# Video/Codec
DUMBER_VIDEO_ACCELERATION_ENABLE=true
LIBVA_DRIVER_NAME=iHD
DUMBER_PREFERRED_CODECS=av1,vp9,h264

Note: Some video/codec env vars use DUMBER_* prefix and match GStreamer/VA-API conventions.

source
1# Configuration Reference
2
3**Primary format**: JSON
4**Location**: `~/.config/dumber/config.json`
5**Also supports**: YAML (`.yaml`) and TOML (`.toml`)
6**JSON Schema**: `~/.config/dumber/config.schema.json` (auto-generated)
7
8## IDE Integration
9
10For autocompletion and validation in VS Code or other editors, add this to the top of your `config.json`:
11
12```json
13{
14  "$schema": "./config.schema.json",
15  "default_zoom": 1.2,
16  ...
17}
18```
19
20The schema is automatically generated when you first create a config file.
21
22## Database
23
24| Key | Type | Default | Description |
25|-----|------|---------|-------------|
26| `database.path` | string | `~/.local/state/dumber/dumber.sqlite` | Database file path |
27
28## History
29
30| Key | Type | Default | Valid Values | Description |
31|-----|------|---------|--------------|-------------|
32| `history.max_entries` | int | `10000` | > 0 | Maximum number of history entries |
33| `history.retention_period_days` | int | `365` | > 0 | Days to keep history (1 year) |
34| `history.cleanup_interval_days` | int | `1` | > 0 | How often to run cleanup |
35
36## Search Shortcuts
37
38| Key | Type | Default | Description |
39|-----|------|---------|-------------|
40| `search_shortcuts` | map | See defaults | Map of shortcut aliases to URLs |
41
42**Default shortcuts:**
43```json
44{
45  "search_shortcuts": {
46    "g": {
47      "url": "https://google.com/search?q=%s",
48      "description": "Google Search"
49    },
50    "gh": {
51      "url": "https://github.com/search?q=%s",
52      "description": "GitHub"
53    },
54    "yt": {
55      "url": "https://youtube.com/results?search_query=%s",
56      "description": "YouTube"
57    }
58  }
59}
60```
61
62## Dmenu / Launcher
63
64| Key | Type | Default | Description |
65|-----|------|---------|-------------|
66| `dmenu.max_history_items` | int | `20` | Max items shown in launcher |
67| `dmenu.show_visit_count` | bool | `true` | Show visit counts |
68| `dmenu.show_last_visited` | bool | `true` | Show last visited dates |
69| `dmenu.history_prefix` | string | `"🕒"` | Prefix for history items |
70| `dmenu.shortcut_prefix` | string | `"🔍"` | Prefix for shortcuts |
71| `dmenu.url_prefix` | string | `"🌐"` | Prefix for URLs |
72| `dmenu.date_format` | string | `"2006-01-02 15:04"` | Go time format string |
73| `dmenu.sort_by_visit_count` | bool | `true` | Sort by popularity |
74
75## Logging
76
77| Key | Type | Default | Valid Values | Description |
78|-----|------|---------|--------------|-------------|
79| `logging.level` | string | `"info"` | `debug`, `info`, `warn`, `error` | Log level |
80| `logging.format` | string | `"text"` | `text`, `json` | Log format |
81| `logging.filename` | string | `""` | any | Empty = stdout |
82| `logging.max_size` | int | `100` | > 0 | Max log size in MB |
83| `logging.max_backups` | int | `3` | >= 0 | Number of log backups |
84| `logging.max_age` | int | `7` | >= 0 | Days to keep logs |
85| `logging.compress` | bool | `true` | - | Compress old logs |
86| `logging.log_dir` | string | `~/.local/state/dumber/logs/` | any | Log directory |
87| `logging.enable_file_log` | bool | `true` | - | Enable file logging |
88| `logging.capture_stdout` | bool | `false` | - | Capture stdout to log |
89| `logging.capture_stderr` | bool | `false` | - | Capture stderr to log |
90| `logging.capture_c_output` | bool | `false` | - | Capture C/CGO output |
91| `logging.capture_console` | bool | `false` | - | Capture browser console |
92| `logging.debug_file` | string | `"debug.log"` | any | Debug log filename |
93| `logging.verbose_webkit` | bool | `false` | - | Verbose WebKit logs |
94
95## Appearance
96
97| Key | Type | Default | Description |
98|-----|------|---------|-------------|
99| `appearance.sans_font` | string | `"Fira Sans"` | Sans-serif font |
100| `appearance.serif_font` | string | `"Fira Sans"` | Serif font |
101| `appearance.monospace_font` | string | `"Fira Code"` | Monospace font |
102| `appearance.default_font_size` | int | `16` | Font size in points |
103| `appearance.color_scheme` | string | `"default"` | `prefer-dark`, `prefer-light`, `default` |
104
105### Color Palettes
106
107**Light palette:**
108```json
109{
110  "appearance": {
111    "light_palette": {
112      "background": "#f8f8f8",
113      "surface": "#f2f2f2",
114      "surface_variant": "#ececec",
115      "text": "#1a1a1a",
116      "muted": "#6e6e6e",
117      "accent": "#404040",
118      "border": "#d2d2d2"
119    }
120  }
121}
122```
123
124**Dark palette:**
125```json
126{
127  "appearance": {
128    "dark_palette": {
129      "background": "#0e0e0e",
130      "surface": "#1a1a1a",
131      "surface_variant": "#141414",
132      "text": "#e4e4e4",
133      "muted": "#848484",
134      "accent": "#a8a8a8",
135      "border": "#363636"
136    }
137  }
138}
139```
140
141## Video Acceleration
142
143| Key | Type | Default | Description |
144|-----|------|---------|-------------|
145| `video_acceleration.enable_vaapi` | bool | `true` | Enable VA-API hardware accel |
146| `video_acceleration.auto_detect_gpu` | bool | `true` | Auto-detect GPU driver |
147| `video_acceleration.vaapi_driver_name` | string | `""` | Driver name (auto-detected) |
148| `video_acceleration.enable_all_drivers` | bool | `true` | Enable all VA-API drivers |
149| `video_acceleration.legacy_vaapi` | bool | `false` | Legacy VA-API mode |
150
151## Codec Preferences
152
153| Key | Type | Default | Valid Values | Description |
154|-----|------|---------|--------------|-------------|
155| `codec_preferences.preferred_codecs` | string | `"av1,h264"` | Comma-separated | Codec priority order |
156| `codec_preferences.force_av1` | bool | `false` | - | Force AV1 codec |
157| `codec_preferences.block_vp9` | bool | `false` | - | Block VP9 codec |
158| `codec_preferences.block_vp8` | bool | `true` | - | Block VP8 codec |
159| `codec_preferences.av1_hardware_only` | bool | `false` | - | Disable AV1 software fallback |
160| `codec_preferences.disable_vp9_hardware` | bool | `false` | - | Disable VP9 hardware accel |
161| `codec_preferences.video_buffer_size_mb` | int | `16` | > 0 | Video buffer size in MB |
162| `codec_preferences.queue_buffer_time_sec` | int | `10` | > 0 | Queue buffer time in seconds |
163| `codec_preferences.custom_user_agent` | string | Chrome UA | any | Custom user agent string |
164| `codec_preferences.av1_max_resolution` | string | `"1080p"` | `720p`, `1080p`, `1440p`, `4k`, `unlimited` | Max AV1 resolution |
165| `codec_preferences.disable_twitch_codec_control` | bool | `true` | - | Disable codec control on Twitch |
166
167## Debug Options
168
169| Key | Type | Default | Description |
170|-----|------|---------|-------------|
171| `debug.enable_webkit_debug` | bool | `false` | Enable WebKit debug logs |
172| `debug.webkit_debug_categories` | string | `"Network:preconnectTo,ContentFilters"` | Debug categories |
173| `debug.enable_filtering_debug` | bool | `false` | Content filter debug |
174| `debug.enable_webview_debug` | bool | `false` | WebView state debug |
175| `debug.log_webkit_crashes` | bool | `true` | Log WebKit crashes |
176| `debug.enable_script_debug` | bool | `false` | Script injection debug |
177| `debug.enable_general_debug` | bool | `false` | General debug mode |
178| `debug.enable_workspace_debug` | bool | `false` | Workspace navigation debug |
179| `debug.enable_focus_debug` | bool | `false` | Focus state debug |
180| `debug.enable_css_debug` | bool | `false` | CSS reconciler debug |
181| `debug.enable_focus_metrics` | bool | `false` | Focus metrics tracking |
182| `debug.enable_pane_close_debug` | bool | `false` | Pane close debug |
183
184## Rendering & Zoom
185
186| Key | Type | Default | Valid Values | Description |
187|-----|------|---------|--------------|-------------|
188| `rendering_mode` | string | `"gpu"` | `auto`, `gpu`, `cpu` | Rendering mode |
189| `use_dom_zoom` | bool | `false` | - | Use DOM-based zoom |
190| `default_zoom` | float | `1.2` | > 0 | Default zoom level (120%) |
191
192## Workspace Configuration
193
194| Key | Type | Default | Description |
195|-----|------|---------|-------------|
196| `workspace.enable_zellij_controls` | bool | `true` | Enable Zellij-style keybindings |
197
198### Pane Mode
199
200| Key | Type | Default | Description |
201|-----|------|---------|-------------|
202| `workspace.pane_mode.activation_shortcut` | string | `"ctrl+p"` | Pane mode activation key |
203| `workspace.pane_mode.timeout_ms` | int | `3000` | Pane mode timeout (ms) |
204| `workspace.pane_mode.action_bindings` | map | See below | Pane mode key bindings |
205
206**Default pane mode bindings:**
207```json
208{
209  "workspace": {
210    "pane_mode": {
211      "action_bindings": {
212        "arrowright": "split-right",
213        "arrowleft": "split-left",
214        "arrowup": "split-up",
215        "arrowdown": "split-down",
216        "r": "split-right",
217        "l": "split-left",
218        "u": "split-up",
219        "d": "split-down",
220        "x": "close-pane",
221        "enter": "confirm",
222        "escape": "cancel"
223      }
224    }
225  }
226}
227```
228
229### Tab Shortcuts
230
231| Key | Type | Default | Description |
232|-----|------|---------|-------------|
233| `workspace.tabs.new_tab` | string | `"ctrl+t"` | New tab shortcut |
234| `workspace.tabs.close_tab` | string | `"ctrl+w"` | Close tab shortcut |
235| `workspace.tabs.next_tab` | string | `"ctrl+tab"` | Next tab shortcut |
236| `workspace.tabs.previous_tab` | string | `"ctrl+shift+tab"` | Previous tab shortcut |
237
238### Popup Behavior
239
240| Key | Type | Default | Valid Values | Description |
241|-----|------|---------|--------------|-------------|
242| `workspace.popups.behavior` | string | `"split"` | `split`, `stacked`, `tabbed`, `windowed` | Popup opening mode |
243| `workspace.popups.placement` | string | `"right"` | `right`, `left`, `top`, `bottom` | Split direction |
244| `workspace.popups.open_in_new_pane` | bool | `true` | - | Open popups in workspace |
245| `workspace.popups.follow_pane_context` | bool | `true` | - | Follow parent pane context |
246| `workspace.popups.blank_target_behavior` | string | `"pane"` | `pane`, `tab` | `_blank` target handling |
247| `workspace.popups.enable_smart_detection` | bool | `true` | - | Use WindowProperties for detection |
248| `workspace.popups.oauth_auto_close` | bool | `true` | - | Auto-close OAuth popups |
249
250### Workspace Styling
251
252| Key | Type | Default | Description |
253|-----|------|---------|-------------|
254| `workspace.styling.border_width` | int | `2` | Border width in pixels |
255| `workspace.styling.border_color` | string | `"@theme_selected_bg_color"` | Border color (CSS or theme var) |
256| `workspace.styling.pane_mode_border_color` | string | `"#FFA500"` | Pane mode border color (orange) |
257| `workspace.styling.transition_duration` | int | `120` | Transition duration (ms) |
258| `workspace.styling.border_radius` | int | `0` | Border radius in pixels |
259
260## Content Filtering
261
262| Key | Type | Default | Description |
263|-----|------|---------|-------------|
264| `content_filtering_whitelist` | array | See below | Domains to skip ad blocking |
265
266**Default whitelist:**
267```json
268{
269  "content_filtering_whitelist": [
270    "twitch.tv",
271    "passport.twitch.tv",
272    "gql.twitch.tv"
273  ]
274}
275```
276
277## Environment Variables
278
279All config values can be overridden via environment variables with the prefix `DUMB_BROWSER_`:
280
281```bash
282# Database
283DUMB_BROWSER_DATABASE_PATH=/custom/path/db.sqlite
284
285# Rendering
286DUMBER_RENDERING_MODE=cpu
287DUMBER_DEFAULT_ZOOM=1.5
288
289# Video/Codec
290DUMBER_VIDEO_ACCELERATION_ENABLE=true
291LIBVA_DRIVER_NAME=iHD
292DUMBER_PREFERRED_CODECS=av1,vp9,h264
293```
294
295**Note:** Some video/codec env vars use `DUMBER_*` prefix and match GStreamer/VA-API conventions.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close