detached 4eb40e5

docs: align README and CONFIG with latest features

commit
4eb40e5737c4c631d321843e0cd839a75a5541b1
author
bnema · · 2025-11-17 18:17 UTC
committer
bnema · · 2025-11-17 17:02 UTC
parent
8289f2a
signature
unsigned
2 files · +84 -98
M README.md +60 -97
@@ -4,34 +4,23 @@
44 <img src="assets/logo.svg" alt="Dumber Logo" width="256" height="256" />
55 </p>
66
7-Dumber is a minimalist browser and launcher companion focused on speed and simplicity. It ships a built‑in WebKitGTK (GTK4) window for navigation and a CLI with dmenu‑style launcher integration (rofi, fuzzel).
7+A dumb browser that works like your favorite terminal multiplexer.
88
9-- Native GUI via WebKitGTK 6 (GTK4, CGO) with an embedded homepage UI.
10-- CLI that parses URLs, supports search shortcuts (e.g., `g:query`), and integrates with rofi/dmenu.
11-- Persistent history and per‑domain zoom levels (SQLite, XDG locations).
12-- Configurable via `config.json` and environment variables, with live reload.
13-
14-## Wayland‑First
15-- Dumb on purpose, designed for Wayland window managers (Sway, Hyprland, River, Niri, etc..) it's a tiny companion that interact nicely with your launcher.
16-- Uses a native Wayland WebKitGTK-6.0 window; no external browser required and no X11/XWayland dependency.
17-- Optimized for dmenu‑style launchers (rofi, fuzzel, wofi) and keyboard‑driven workflows.
9+## Features
10+- **Wayland native**: No X11/XWayland dependency, works with Sway, Hyprland, River, Niri, etc.
11+- **Tabs and workspaces**: Each tab holds a workspace with split or stacked panes.
12+- **Keyboard-driven**: Complete keyboard workflow inspired by Zellij.
13+- **Smart popup handling**: OAuth flows, window.open(), and popup deduplication for tiling WMs.
14+- **GPU rendering**: Hardware video acceleration with automatic VA-API/VDPAU detection.
15+- **Built-in ad blocking**: UBlock-based network filtering (cosmetic filtering in progress).
16+- **Launcher integration**: dmenu-style with rofi/fuzzel support, shows favicons and history.
17+- **Search shortcuts**: Quick search via aliases (e.g., `g:golang` for Google).
18+- **Customizable themes**: Light and dark palettes with semantic color tokens.
19+- **Persistent storage**: SQLite for history, zoom levels, and settings.
20+- **Live configuration**: Single config file with hot reload when possible.
1821
1922 ## Status
20-- Early development stage with regular releases. The workspace management system is fully functional and the browser works well for daily use. Expect some rough edges but core features are stable.
21-
22-## Features
23-- **Complete workspace management**: Zellij-inspired pane splitting with binary tree layout, stacked panes with title bars, focus tracking, and modal keyboard controls
24-- **Multi-pane WebView architecture**: Independent browsing sessions per pane with proper lifecycle management
25-- **Advanced popup handling**: Intelligent popup management for tiling WMs - OAuth flows, window.open(), and popup deduplication
26-- **Window-level global shortcuts**: Centralized shortcut handling to prevent conflicts between multiple WebView instances
27-- **GPU rendering and hardware video acceleration**: Automatic GPU detection with VA-API/VDPAU support
28-- **Built-in ad blocker**: UBlock-based content filtering (network blocking functional, cosmetic filtering in progress)
29-- **Configurable color palettes**: Customizable light and dark themes with semantic color tokens injected as CSS custom properties
30-- **Terminal-style UI design**: Monospace fonts, sharp corners, dashed borders with configurable appearance settings
31-- **dmenu‑style launcher integration**: rofi, fuzzel integration with favicon display, history and search shortcut suggestions
32-- **Comprehensive keyboard controls**: Complete keyboard-driven workflow with shortcuts and gestures
33-- **Persistent history and zoom**: SQLite-based history with configurable default zoom and per‑domain zoom persistence
34-- **Fully configurable**: Single config file with live reload and environment variable overrides
23+Early development with regular releases. Core features work well for daily use but expect some rough edges.
3524
3625 ## Controls & Shortcuts
3726
@@ -53,7 +42,21 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
5342 | **Ctrl+Shift+R** | Hard Reload | Refresh ignoring cache |
5443 | **Ctrl+←** / **Ctrl+→** | Navigate Back/Forward | Browser history navigation |
5544
56-#### Zellij-Inspired Pane Management
45+#### Tab Management
46+| Shortcut | Action | Notes |
47+|----------|--------|-------|
48+| **Ctrl+T** | Enter Tab Mode | Modal mode for tab operations |
49+| **Ctrl+Tab** | Next Tab | Quick tab switching |
50+| **Ctrl+Shift+Tab** | Previous Tab | Quick tab switching |
51+| **Ctrl+W** | Close Tab | Close current tab |
52+| **N** / **C** (in tab mode) | New Tab | Create new tab |
53+| **X** (in tab mode) | Close Tab | Close current tab |
54+| **L** / **Tab** (in tab mode) | Next Tab | Navigate to next tab |
55+| **H** / **Shift+Tab** (in tab mode) | Previous Tab | Navigate to previous tab |
56+| **R** (in tab mode) | Rename Tab | Rename current tab |
57+| **Escape** (in tab mode) | Exit Tab Mode | Return to normal navigation |
58+
59+#### Pane Management
5760 | Shortcut | Action | Notes |
5861 |----------|--------|-------|
5962 | **Ctrl+P** | Enter Pane Mode | Modal mode for pane operations |
@@ -80,10 +83,13 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
8083 ### Omnibox/Find Mode (when active)
8184 | Shortcut | Action | Notes |
8285 |----------|--------|-------|
83-| **Escape** | Close overlay | Exit omnibox or find mode |
86+| **Escape** | Close/Clear | Clear input if text present, close if empty |
8487 | **Enter** | Execute/Navigate | Navigate to URL or jump to match |
8588 | **Shift+Enter** | Previous Match | Find mode: go to previous match |
8689 | **Alt+Enter** | Center Match | Find mode: center on match, keep open |
90+| **Tab** | Toggle View | Omnibox mode: switch between history and favorites |
91+| **Space** | Toggle Favorite | Omnibox mode: favorite/unfavorite selected item |
92+| **Ctrl+1-9, 0** | Quick Navigate | Jump to result by number (1-10) |
8793 | **↑/↓ Arrow** | Navigate Results | Browse suggestions/matches |
8894
8995 All zoom changes are automatically persisted per-domain and restored on next visit.
@@ -99,7 +105,7 @@ Prerequisites:
99105 Build options:
100106 - GUI (default, recommended):
101107 - `make build` # builds frontend + Go with `-tags=webkit_cgo`
102- - Run: `./dist/dumber` # opens the embedded homepage
108+ - Run: `./dist/dumber` # to see all available commands.
103109 - CLI‑only (no GUI, CGO disabled):
104110 - `make build-no-gui`
105111 - Run: `./dist/dumber-no-gui version`
@@ -112,7 +118,6 @@ Development:
112118 **Note**: `go install` will not work for this project because the frontend assets must be built first and embedded into the binary. Use the build commands instead:
113119
114120 - GUI build (default, recommended):
115- - Ensure WebKit2GTK/GTK dev packages are installed (see prerequisites)
116121 - Clone the repo and run `make build` (builds frontend first, then Go with GUI support)
117122 - The resulting `./dist/dumber` binary includes the native GUI window
118123 - CLI‑only (no native window):
@@ -123,16 +128,15 @@ Development:
123128 - Open a URL or search:
124129 - `dumber browse https://example.com`
125130 - `dumber browse example.com` # scheme auto‑added
131+ - `dumber browse dumb://home` # built-in homepage with stats
126132 - `dumber browse g:golang` # Google search via shortcut
127-- Launch the GUI directly:
128- - `dumber` # no args → opens GUI homepage
129133 - Show version information:
130134 - `dumber version` # display version, commit, and build date
131135 - Launcher integration (dmenu‑style examples):
132- - rofi: `dumber dmenu | rofi -dmenu -p "Browse: " | dumber dmenu --select`
133- - fuzzel: `dumber dmenu | fuzzel --dmenu -p "Browse: " | dumber dmenu --select`
136+ - rofi: `dumber dmenu | rofi -dmenu -p "🔍 " | dumber dmenu --select`
137+ - fuzzel: `dumber dmenu | fuzzel --dmenu -p "🔍 " | dumber dmenu --select`
134138 - Manage browsing history:
135- - `dumber history` # list recent history (default: 20 entries)
139+ - `dumber history` # list recent history (default: 20 entries)
136140 - `dumber history list -n 50` # list 50 recent entries
137141 - `dumber history search golang` # search history for "golang"
138142 - `dumber history stats` # show history statistics
@@ -157,9 +161,24 @@ Note: The root flag path only generates options; for processing a selection (`--
157161
158162 In GUI mode the app serves an embedded homepage via `dumb://homepage`, and frontend assets under `dumb://app/...`.
159163
160-## Pane Management (Zellij-Inspired)
164+## Tab Management
161165
162-Dumber features a Zellij-inspired pane management system that allows you to split your browser window into multiple panes, each running independent web sessions.
166+Each tab holds its own workspace. Each workspace can contain multiple panes (split or stacked). Switch between tabs to switch between independent workspaces.
167+
168+### How it Works
169+1. **Enter Tab Mode**: Press `Ctrl+T` to enter tab mode (modal interface with timeout)
170+2. **Create/Close Tabs**: Use keyboard shortcuts:
171+ - `N` or `C` - New tab
172+ - `X` - Close current tab
173+ - `R` - Rename tab
174+3. **Navigate**: Use `Ctrl+Tab` / `Ctrl+Shift+Tab` for quick tab switching, or `L`/`H` in tab mode
175+4. **Exit**: Press `Escape` to exit tab mode or wait for timeout
176+
177+Tab mode provides visual feedback with an orange border indicator.
178+
179+## Pane Management
180+
181+Split your browser window into multiple panes, each running independent web sessions.
163182
164183 ### How it Works
165184 1. **Enter Pane Mode**: Press `Ctrl+P` to enter pane mode (modal interface with timeout)
@@ -172,69 +191,13 @@ Dumber features a Zellij-inspired pane management system that allows you to spli
172191 3. **Navigate**: Use `Alt+Arrow Keys` to move focus between split panes, or `Alt+Up/Down` to navigate within stacked panes
173192 4. **Close**: Press `X` in pane mode to close the current pane
174193
175-### Configuration
176-The pane system is fully configurable via `config.toml`:
177-```toml
178-[workspace.pane_mode]
179-activation_shortcut = "ctrl+p"
180-timeout_ms = 3000
181-
182-[workspace.pane_mode.actions]
183-split-right = ["arrowright", "r"]
184-split-left = ["arrowleft", "l"]
185-close-pane = ["x"]
186-# ... full action mappings
187-
188-[workspace.popups]
189-placement = "right"
190-open_in_new_pane = true
191-
192-[workspace.styling]
193-border_width = 2
194-border_color = "@theme_selected_bg_color"
195-transition_duration = 120
196-```
197-
198194 ## Configuration
199195
200-Dumber follows the XDG Base Directory spec:
201-- Config: `~/.config/dumber/config.toml` (also supports `.json` and `.yaml`)
202-- Data: `~/.local/share/dumber`
203-- State: `~/.local/state/dumber` (default DB lives here)
204-
205-A default `config.toml` is created on first run. Config changes are watched and applied at runtime when possible.
206-
207-### How Configuration Works
208-
209-- **Config file**: `~/.config/dumber/config.toml` (also supports `.json` and `.yaml`)
210-- **Format**: JSON/YAML/TOML - auto-detected
211-- **JSON Schema**: Auto-generated for IDE autocompletion and validation
212-- **Live reload**: Changes are automatically applied without restarting
213-- **Environment variables**: Override any setting with `DUMB_BROWSER_*` or `DUMBER_*` prefix
214-- **Default values**: Sensible defaults for all settings
215-
216-### Quick Examples
217-
218-```json
219-{
220- "default_zoom": 1.2,
221- "rendering_mode": "gpu",
222- "search_shortcuts": {
223- "g": { "url": "https://google.com/search?q=%s", "description": "Google" }
224- },
225- "workspace": {
226- "popups": { "behavior": "split" }
227- }
228-}
229-```
196+Configuration file: `~/.config/dumber/config.toml` (supports TOML, JSON, YAML)
230197
231-Environment variable override:
232-```bash
233-DUMBER_RENDERING_MODE=cpu dumber
234-DUMB_BROWSER_LOGGING_LEVEL=debug dumber
235-```
198+A default config is created on first run. Changes are applied automatically (hot reload). Override any setting with `DUMB_BROWSER_*` or `DUMBER_*` environment variables.
236199
237-**📖 Complete documentation**: See [docs/CONFIG.md](docs/CONFIG.md) for all available settings, defaults, and valid values.
200+**Full documentation**: [docs/CONFIG.md](docs/CONFIG.md) - Complete reference for all settings, workspace controls, shortcuts, styling, and more.
238201
239202
240203 ## Building With WebKitGTK 6 (GTK4)
@@ -274,10 +237,10 @@ I will gladly accept contributions, especially related to UI/UX enhancements. Fe
274237 ## Roadmap
275238 - ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete)
276239 - ✅ GPU rendering (Vulkan via GTK4 renderer) with graceful CPU fallback
277-- ✅ Zellij-inspired pane management with binary tree layout and keyboard-driven workflow
240+- ✅ Modal pane management with binary tree layout and keyboard-driven workflow
241+- ✅ Tab management system with modal controls
278242 - 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work)
279243 - Full Vim-style motion and keyboard navigation across pages and UI
280-- Tab management system (browser tabs in addition to panes)
281244 - Performance work: faster startup, lower memory, snappier UI
282245 - Other shiny things I'm not yet aware of
283246
@@ -4,34 +4,23 @@
4 <img src="assets/logo.svg" alt="Dumber Logo" width="256" height="256" />4 <img src="assets/logo.svg" alt="Dumber Logo" width="256" height="256" />
5 </p>5 </p>
6 6
7-Dumber is a minimalist browser and launcher companion focused on speed and simplicity. It ships a built‑in WebKitGTK (GTK4) window for navigation and a CLI with dmenu‑style launcher integration (rofi, fuzzel).7+A dumb browser that works like your favorite terminal multiplexer.
8 8
9-- Native GUI via WebKitGTK 6 (GTK4, CGO) with an embedded homepage UI.9+## Features
10-- CLI that parses URLs, supports search shortcuts (e.g., `g:query`), and integrates with rofi/dmenu.10+- **Wayland native**: No X11/XWayland dependency, works with Sway, Hyprland, River, Niri, etc.
11-- Persistent history and per‑domain zoom levels (SQLite, XDG locations).11+- **Tabs and workspaces**: Each tab holds a workspace with split or stacked panes.
12-- Configurable via `config.json` and environment variables, with live reload.12+- **Keyboard-driven**: Complete keyboard workflow inspired by Zellij.
13-13+- **Smart popup handling**: OAuth flows, window.open(), and popup deduplication for tiling WMs.
14-## Wayland‑First14+- **GPU rendering**: Hardware video acceleration with automatic VA-API/VDPAU detection.
15-- Dumb on purpose, designed for Wayland window managers (Sway, Hyprland, River, Niri, etc..) it's a tiny companion that interact nicely with your launcher.15+- **Built-in ad blocking**: UBlock-based network filtering (cosmetic filtering in progress).
16-- Uses a native Wayland WebKitGTK-6.0 window; no external browser required and no X11/XWayland dependency.16+- **Launcher integration**: dmenu-style with rofi/fuzzel support, shows favicons and history.
17-- Optimized for dmenu‑style launchers (rofi, fuzzel, wofi) and keyboard‑driven workflows.17+- **Search shortcuts**: Quick search via aliases (e.g., `g:golang` for Google).
18+- **Customizable themes**: Light and dark palettes with semantic color tokens.
19+- **Persistent storage**: SQLite for history, zoom levels, and settings.
20+- **Live configuration**: Single config file with hot reload when possible.
18 21
19 ## Status22 ## Status
20-- Early development stage with regular releases. The workspace management system is fully functional and the browser works well for daily use. Expect some rough edges but core features are stable.23+Early development with regular releases. Core features work well for daily use but expect some rough edges.
21-
22-## Features
23-- **Complete workspace management**: Zellij-inspired pane splitting with binary tree layout, stacked panes with title bars, focus tracking, and modal keyboard controls
24-- **Multi-pane WebView architecture**: Independent browsing sessions per pane with proper lifecycle management
25-- **Advanced popup handling**: Intelligent popup management for tiling WMs - OAuth flows, window.open(), and popup deduplication
26-- **Window-level global shortcuts**: Centralized shortcut handling to prevent conflicts between multiple WebView instances
27-- **GPU rendering and hardware video acceleration**: Automatic GPU detection with VA-API/VDPAU support
28-- **Built-in ad blocker**: UBlock-based content filtering (network blocking functional, cosmetic filtering in progress)
29-- **Configurable color palettes**: Customizable light and dark themes with semantic color tokens injected as CSS custom properties
30-- **Terminal-style UI design**: Monospace fonts, sharp corners, dashed borders with configurable appearance settings
31-- **dmenu‑style launcher integration**: rofi, fuzzel integration with favicon display, history and search shortcut suggestions
32-- **Comprehensive keyboard controls**: Complete keyboard-driven workflow with shortcuts and gestures
33-- **Persistent history and zoom**: SQLite-based history with configurable default zoom and per‑domain zoom persistence
34-- **Fully configurable**: Single config file with live reload and environment variable overrides
35 24
36 ## Controls & Shortcuts25 ## Controls & Shortcuts
37 26
@@ -53,7 +42,21 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
53 | **Ctrl+Shift+R** | Hard Reload | Refresh ignoring cache |42 | **Ctrl+Shift+R** | Hard Reload | Refresh ignoring cache |
54 | **Ctrl+←** / **Ctrl+→** | Navigate Back/Forward | Browser history navigation |43 | **Ctrl+←** / **Ctrl+→** | Navigate Back/Forward | Browser history navigation |
55 44
56-#### Zellij-Inspired Pane Management45+#### Tab Management
46+| Shortcut | Action | Notes |
47+|----------|--------|-------|
48+| **Ctrl+T** | Enter Tab Mode | Modal mode for tab operations |
49+| **Ctrl+Tab** | Next Tab | Quick tab switching |
50+| **Ctrl+Shift+Tab** | Previous Tab | Quick tab switching |
51+| **Ctrl+W** | Close Tab | Close current tab |
52+| **N** / **C** (in tab mode) | New Tab | Create new tab |
53+| **X** (in tab mode) | Close Tab | Close current tab |
54+| **L** / **Tab** (in tab mode) | Next Tab | Navigate to next tab |
55+| **H** / **Shift+Tab** (in tab mode) | Previous Tab | Navigate to previous tab |
56+| **R** (in tab mode) | Rename Tab | Rename current tab |
57+| **Escape** (in tab mode) | Exit Tab Mode | Return to normal navigation |
58+
59+#### Pane Management
57 | Shortcut | Action | Notes |60 | Shortcut | Action | Notes |
58 |----------|--------|-------|61 |----------|--------|-------|
59 | **Ctrl+P** | Enter Pane Mode | Modal mode for pane operations |62 | **Ctrl+P** | Enter Pane Mode | Modal mode for pane operations |
@@ -80,10 +83,13 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl
80 ### Omnibox/Find Mode (when active)83 ### Omnibox/Find Mode (when active)
81 | Shortcut | Action | Notes |84 | Shortcut | Action | Notes |
82 |----------|--------|-------|85 |----------|--------|-------|
83-| **Escape** | Close overlay | Exit omnibox or find mode |86+| **Escape** | Close/Clear | Clear input if text present, close if empty |
84 | **Enter** | Execute/Navigate | Navigate to URL or jump to match |87 | **Enter** | Execute/Navigate | Navigate to URL or jump to match |
85 | **Shift+Enter** | Previous Match | Find mode: go to previous match |88 | **Shift+Enter** | Previous Match | Find mode: go to previous match |
86 | **Alt+Enter** | Center Match | Find mode: center on match, keep open |89 | **Alt+Enter** | Center Match | Find mode: center on match, keep open |
90+| **Tab** | Toggle View | Omnibox mode: switch between history and favorites |
91+| **Space** | Toggle Favorite | Omnibox mode: favorite/unfavorite selected item |
92+| **Ctrl+1-9, 0** | Quick Navigate | Jump to result by number (1-10) |
87 | **↑/↓ Arrow** | Navigate Results | Browse suggestions/matches |93 | **↑/↓ Arrow** | Navigate Results | Browse suggestions/matches |
88 94
89 All zoom changes are automatically persisted per-domain and restored on next visit.95 All zoom changes are automatically persisted per-domain and restored on next visit.
@@ -99,7 +105,7 @@ Prerequisites:
99 Build options:105 Build options:
100 - GUI (default, recommended):106 - GUI (default, recommended):
101 - `make build` # builds frontend + Go with `-tags=webkit_cgo`107 - `make build` # builds frontend + Go with `-tags=webkit_cgo`
102- - Run: `./dist/dumber` # opens the embedded homepage108+ - Run: `./dist/dumber` # to see all available commands.
103 - CLI‑only (no GUI, CGO disabled):109 - CLI‑only (no GUI, CGO disabled):
104 - `make build-no-gui`110 - `make build-no-gui`
105 - Run: `./dist/dumber-no-gui version`111 - Run: `./dist/dumber-no-gui version`
@@ -112,7 +118,6 @@ Development:
112 **Note**: `go install` will not work for this project because the frontend assets must be built first and embedded into the binary. Use the build commands instead:118 **Note**: `go install` will not work for this project because the frontend assets must be built first and embedded into the binary. Use the build commands instead:
113 119
114 - GUI build (default, recommended):120 - GUI build (default, recommended):
115- - Ensure WebKit2GTK/GTK dev packages are installed (see prerequisites)
116 - Clone the repo and run `make build` (builds frontend first, then Go with GUI support)121 - Clone the repo and run `make build` (builds frontend first, then Go with GUI support)
117 - The resulting `./dist/dumber` binary includes the native GUI window122 - The resulting `./dist/dumber` binary includes the native GUI window
118 - CLI‑only (no native window):123 - CLI‑only (no native window):
@@ -123,16 +128,15 @@ Development:
123 - Open a URL or search:128 - Open a URL or search:
124 - `dumber browse https://example.com`129 - `dumber browse https://example.com`
125 - `dumber browse example.com` # scheme auto‑added130 - `dumber browse example.com` # scheme auto‑added
131+ - `dumber browse dumb://home` # built-in homepage with stats
126 - `dumber browse g:golang` # Google search via shortcut132 - `dumber browse g:golang` # Google search via shortcut
127-- Launch the GUI directly:
128- - `dumber` # no args → opens GUI homepage
129 - Show version information:133 - Show version information:
130 - `dumber version` # display version, commit, and build date134 - `dumber version` # display version, commit, and build date
131 - Launcher integration (dmenu‑style examples):135 - Launcher integration (dmenu‑style examples):
132- - rofi: `dumber dmenu | rofi -dmenu -p "Browse: " | dumber dmenu --select`136+ - rofi: `dumber dmenu | rofi -dmenu -p "🔍 " | dumber dmenu --select`
133- - fuzzel: `dumber dmenu | fuzzel --dmenu -p "Browse: " | dumber dmenu --select`137+ - fuzzel: `dumber dmenu | fuzzel --dmenu -p "🔍 " | dumber dmenu --select`
134 - Manage browsing history:138 - Manage browsing history:
135- - `dumber history` # list recent history (default: 20 entries)139+ - `dumber history` # list recent history (default: 20 entries)
136 - `dumber history list -n 50` # list 50 recent entries140 - `dumber history list -n 50` # list 50 recent entries
137 - `dumber history search golang` # search history for "golang"141 - `dumber history search golang` # search history for "golang"
138 - `dumber history stats` # show history statistics142 - `dumber history stats` # show history statistics
@@ -157,9 +161,24 @@ Note: The root flag path only generates options; for processing a selection (`--
157 161
158 In GUI mode the app serves an embedded homepage via `dumb://homepage`, and frontend assets under `dumb://app/...`.162 In GUI mode the app serves an embedded homepage via `dumb://homepage`, and frontend assets under `dumb://app/...`.
159 163
160-## Pane Management (Zellij-Inspired)164+## Tab Management
161 165
162-Dumber features a Zellij-inspired pane management system that allows you to split your browser window into multiple panes, each running independent web sessions.166+Each tab holds its own workspace. Each workspace can contain multiple panes (split or stacked). Switch between tabs to switch between independent workspaces.
167+
168+### How it Works
169+1. **Enter Tab Mode**: Press `Ctrl+T` to enter tab mode (modal interface with timeout)
170+2. **Create/Close Tabs**: Use keyboard shortcuts:
171+ - `N` or `C` - New tab
172+ - `X` - Close current tab
173+ - `R` - Rename tab
174+3. **Navigate**: Use `Ctrl+Tab` / `Ctrl+Shift+Tab` for quick tab switching, or `L`/`H` in tab mode
175+4. **Exit**: Press `Escape` to exit tab mode or wait for timeout
176+
177+Tab mode provides visual feedback with an orange border indicator.
178+
179+## Pane Management
180+
181+Split your browser window into multiple panes, each running independent web sessions.
163 182
164 ### How it Works183 ### How it Works
165 1. **Enter Pane Mode**: Press `Ctrl+P` to enter pane mode (modal interface with timeout)184 1. **Enter Pane Mode**: Press `Ctrl+P` to enter pane mode (modal interface with timeout)
@@ -172,69 +191,13 @@ Dumber features a Zellij-inspired pane management system that allows you to spli
172 3. **Navigate**: Use `Alt+Arrow Keys` to move focus between split panes, or `Alt+Up/Down` to navigate within stacked panes191 3. **Navigate**: Use `Alt+Arrow Keys` to move focus between split panes, or `Alt+Up/Down` to navigate within stacked panes
173 4. **Close**: Press `X` in pane mode to close the current pane192 4. **Close**: Press `X` in pane mode to close the current pane
174 193
175-### Configuration
176-The pane system is fully configurable via `config.toml`:
177-```toml
178-[workspace.pane_mode]
179-activation_shortcut = "ctrl+p"
180-timeout_ms = 3000
181-
182-[workspace.pane_mode.actions]
183-split-right = ["arrowright", "r"]
184-split-left = ["arrowleft", "l"]
185-close-pane = ["x"]
186-# ... full action mappings
187-
188-[workspace.popups]
189-placement = "right"
190-open_in_new_pane = true
191-
192-[workspace.styling]
193-border_width = 2
194-border_color = "@theme_selected_bg_color"
195-transition_duration = 120
196-```
197-
198 ## Configuration194 ## Configuration
199 195
200-Dumber follows the XDG Base Directory spec:196+Configuration file: `~/.config/dumber/config.toml` (supports TOML, JSON, YAML)
201-- Config: `~/.config/dumber/config.toml` (also supports `.json` and `.yaml`)
202-- Data: `~/.local/share/dumber`
203-- State: `~/.local/state/dumber` (default DB lives here)
204-
205-A default `config.toml` is created on first run. Config changes are watched and applied at runtime when possible.
206-
207-### How Configuration Works
208-
209-- **Config file**: `~/.config/dumber/config.toml` (also supports `.json` and `.yaml`)
210-- **Format**: JSON/YAML/TOML - auto-detected
211-- **JSON Schema**: Auto-generated for IDE autocompletion and validation
212-- **Live reload**: Changes are automatically applied without restarting
213-- **Environment variables**: Override any setting with `DUMB_BROWSER_*` or `DUMBER_*` prefix
214-- **Default values**: Sensible defaults for all settings
215-
216-### Quick Examples
217-
218-```json
219-{
220- "default_zoom": 1.2,
221- "rendering_mode": "gpu",
222- "search_shortcuts": {
223- "g": { "url": "https://google.com/search?q=%s", "description": "Google" }
224- },
225- "workspace": {
226- "popups": { "behavior": "split" }
227- }
228-}
229-```
230 197
231-Environment variable override:198+A default config is created on first run. Changes are applied automatically (hot reload). Override any setting with `DUMB_BROWSER_*` or `DUMBER_*` environment variables.
232-```bash
233-DUMBER_RENDERING_MODE=cpu dumber
234-DUMB_BROWSER_LOGGING_LEVEL=debug dumber
235-```
236 199
237-**📖 Complete documentation**: See [docs/CONFIG.md](docs/CONFIG.md) for all available settings, defaults, and valid values.200+**Full documentation**: [docs/CONFIG.md](docs/CONFIG.md) - Complete reference for all settings, workspace controls, shortcuts, styling, and more.
238 201
239 202
240 ## Building With WebKitGTK 6 (GTK4)203 ## Building With WebKitGTK 6 (GTK4)
@@ -274,10 +237,10 @@ I will gladly accept contributions, especially related to UI/UX enhancements. Fe
274 ## Roadmap237 ## Roadmap
275 - ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete)238 - ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete)
276 - ✅ GPU rendering (Vulkan via GTK4 renderer) with graceful CPU fallback239 - ✅ GPU rendering (Vulkan via GTK4 renderer) with graceful CPU fallback
277-- ✅ Zellij-inspired pane management with binary tree layout and keyboard-driven workflow240+- ✅ Modal pane management with binary tree layout and keyboard-driven workflow
241+- ✅ Tab management system with modal controls
278 - 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work)242 - 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work)
279 - Full Vim-style motion and keyboard navigation across pages and UI243 - Full Vim-style motion and keyboard navigation across pages and UI
280-- Tab management system (browser tabs in addition to panes)
281 - Performance work: faster startup, lower memory, snappier UI244 - Performance work: faster startup, lower memory, snappier UI
282 - Other shiny things I'm not yet aware of245 - Other shiny things I'm not yet aware of
283 246
M docs/CONFIG.md +24 -1
@@ -210,6 +210,28 @@ cancel = ["escape"]
210210
211211 > **Note:** Actions are inverted to key→action map in memory for O(1) lookup performance during navigation.
212212
213+### Tab Mode
214+
215+| Key | Type | Default | Description |
216+|-----|------|---------|-------------|
217+| `workspace.tab_mode.activation_shortcut` | string | `"ctrl+t"` | Tab mode activation key |
218+| `workspace.tab_mode.timeout_ms` | int | `3000` | Tab mode timeout (ms) |
219+| `workspace.tab_mode.actions` | map | See below | Action→keys mappings |
220+
221+**Default tab mode actions:**
222+```toml
223+[workspace.tab_mode.actions]
224+new-tab = ["n", "c"]
225+close-tab = ["x"]
226+next-tab = ["l", "tab"]
227+previous-tab = ["h", "shift+tab"]
228+rename-tab = ["r"]
229+confirm = ["enter"]
230+cancel = ["escape"]
231+```
232+
233+> **Note:** Actions are inverted to key→action map in memory for O(1) lookup performance during navigation.
234+
213235 ### Tab Shortcuts
214236
215237 | Key | Type | Default | Description |
@@ -240,7 +262,8 @@ cancel = ["escape"]
240262 | `workspace.styling.inactive_border_width` | int | `1` | Inactive pane border width (px) |
241263 | `workspace.styling.inactive_border_color` | string | `"@theme_unfocused_bg_color"` | Inactive pane border color |
242264 | `workspace.styling.show_stacked_title_border` | bool | `false` | Show separator on stacked pane titles |
243-| `workspace.styling.pane_mode_border_color` | string | `"#FFA500"` | Pane mode border color (orange) |
265+| `workspace.styling.pane_mode_border_color` | string | `"#4A90E2"` | Pane mode border color (blue) |
266+| `workspace.styling.tab_mode_border_color` | string | `"#FFA500"` | Tab mode border color (orange) |
244267 | `workspace.styling.transition_duration` | int | `120` | Border transition duration (ms) |
245268 | `workspace.styling.border_radius` | int | `0` | Border radius (px) |
246269
@@ -210,6 +210,28 @@ cancel = ["escape"]
210 210
211 > **Note:** Actions are inverted to key→action map in memory for O(1) lookup performance during navigation.211 > **Note:** Actions are inverted to key→action map in memory for O(1) lookup performance during navigation.
212 212
213+### Tab Mode
214+
215+| Key | Type | Default | Description |
216+|-----|------|---------|-------------|
217+| `workspace.tab_mode.activation_shortcut` | string | `"ctrl+t"` | Tab mode activation key |
218+| `workspace.tab_mode.timeout_ms` | int | `3000` | Tab mode timeout (ms) |
219+| `workspace.tab_mode.actions` | map | See below | Action→keys mappings |
220+
221+**Default tab mode actions:**
222+```toml
223+[workspace.tab_mode.actions]
224+new-tab = ["n", "c"]
225+close-tab = ["x"]
226+next-tab = ["l", "tab"]
227+previous-tab = ["h", "shift+tab"]
228+rename-tab = ["r"]
229+confirm = ["enter"]
230+cancel = ["escape"]
231+```
232+
233+> **Note:** Actions are inverted to key→action map in memory for O(1) lookup performance during navigation.
234+
213 ### Tab Shortcuts235 ### Tab Shortcuts
214 236
215 | Key | Type | Default | Description |237 | Key | Type | Default | Description |
@@ -240,7 +262,8 @@ cancel = ["escape"]
240 | `workspace.styling.inactive_border_width` | int | `1` | Inactive pane border width (px) |262 | `workspace.styling.inactive_border_width` | int | `1` | Inactive pane border width (px) |
241 | `workspace.styling.inactive_border_color` | string | `"@theme_unfocused_bg_color"` | Inactive pane border color |263 | `workspace.styling.inactive_border_color` | string | `"@theme_unfocused_bg_color"` | Inactive pane border color |
242 | `workspace.styling.show_stacked_title_border` | bool | `false` | Show separator on stacked pane titles |264 | `workspace.styling.show_stacked_title_border` | bool | `false` | Show separator on stacked pane titles |
243-| `workspace.styling.pane_mode_border_color` | string | `"#FFA500"` | Pane mode border color (orange) |265+| `workspace.styling.pane_mode_border_color` | string | `"#4A90E2"` | Pane mode border color (blue) |
266+| `workspace.styling.tab_mode_border_color` | string | `"#FFA500"` | Tab mode border color (orange) |
244 | `workspace.styling.transition_duration` | int | `120` | Border transition duration (ms) |267 | `workspace.styling.transition_duration` | int | `120` | Border transition duration (ms) |
245 | `workspace.styling.border_radius` | int | `0` | Border radius (px) |268 | `workspace.styling.border_radius` | int | `0` | Border radius (px) |
246 269

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