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 @@ | |||
| 4 | 4 | <img src="assets/logo.svg" alt="Dumber Logo" width="256" height="256" /> | |
| 5 | 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. | |
| 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. | |
| 18 | 21 | ||
| 19 | 22 | ## 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. | |
| 35 | 24 | ||
| 36 | 25 | ## Controls & Shortcuts | |
| 37 | 26 | ||
| @@ -53,7 +42,21 @@ Dumber is a minimalist browser and launcher companion focused on speed and simpl | |||
| 53 | 42 | | **Ctrl+Shift+R** | Hard Reload | Refresh ignoring cache | | |
| 54 | 43 | | **Ctrl+←** / **Ctrl+→** | Navigate Back/Forward | Browser history navigation | | |
| 55 | 44 | ||
| 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 | |
| 57 | 60 | | Shortcut | Action | Notes | | |
| 58 | 61 | |----------|--------|-------| | |
| 59 | 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 | 83 | ### Omnibox/Find Mode (when active) | |
| 81 | 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 | 87 | | **Enter** | Execute/Navigate | Navigate to URL or jump to match | | |
| 85 | 88 | | **Shift+Enter** | Previous Match | Find mode: go to previous match | | |
| 86 | 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 | 93 | | **↑/↓ Arrow** | Navigate Results | Browse suggestions/matches | | |
| 88 | 94 | ||
| 89 | 95 | All zoom changes are automatically persisted per-domain and restored on next visit. | |
| @@ -99,7 +105,7 @@ Prerequisites: | |||
| 99 | 105 | Build options: | |
| 100 | 106 | - GUI (default, recommended): | |
| 101 | 107 | - `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. | |
| 103 | 109 | - CLI‑only (no GUI, CGO disabled): | |
| 104 | 110 | - `make build-no-gui` | |
| 105 | 111 | - Run: `./dist/dumber-no-gui version` | |
| @@ -112,7 +118,6 @@ Development: | |||
| 112 | 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 | 120 | - GUI build (default, recommended): | |
| 115 | - | - Ensure WebKit2GTK/GTK dev packages are installed (see prerequisites) | |
| 116 | 121 | - Clone the repo and run `make build` (builds frontend first, then Go with GUI support) | |
| 117 | 122 | - The resulting `./dist/dumber` binary includes the native GUI window | |
| 118 | 123 | - CLI‑only (no native window): | |
| @@ -123,16 +128,15 @@ Development: | |||
| 123 | 128 | - Open a URL or search: | |
| 124 | 129 | - `dumber browse https://example.com` | |
| 125 | 130 | - `dumber browse example.com` # scheme auto‑added | |
| 131 | + | - `dumber browse dumb://home` # built-in homepage with stats | |
| 126 | 132 | - `dumber browse g:golang` # Google search via shortcut | |
| 127 | - | - Launch the GUI directly: | |
| 128 | - | - `dumber` # no args → opens GUI homepage | |
| 129 | 133 | - Show version information: | |
| 130 | 134 | - `dumber version` # display version, commit, and build date | |
| 131 | 135 | - 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` | |
| 134 | 138 | - Manage browsing history: | |
| 135 | - | - `dumber history` # list recent history (default: 20 entries) | |
| 139 | + | - `dumber history` # list recent history (default: 20 entries) | |
| 136 | 140 | - `dumber history list -n 50` # list 50 recent entries | |
| 137 | 141 | - `dumber history search golang` # search history for "golang" | |
| 138 | 142 | - `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 | 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 | 183 | ### How it Works | |
| 165 | 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 | 191 | 3. **Navigate**: Use `Alt+Arrow Keys` to move focus between split panes, or `Alt+Up/Down` to navigate within stacked panes | |
| 173 | 192 | 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 | 194 | ## Configuration | |
| 199 | 195 | ||
| 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) | |
| 230 | 197 | ||
| 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. | |
| 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 | 203 | ## Building With WebKitGTK 6 (GTK4) | |
| @@ -274,10 +237,10 @@ I will gladly accept contributions, especially related to UI/UX enhancements. Fe | |||
| 274 | 237 | ## Roadmap | |
| 275 | 238 | - ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete) | |
| 276 | 239 | - ✅ 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 | |
| 278 | 242 | - 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work) | |
| 279 | 243 | - Full Vim-style motion and keyboard navigation across pages and UI | |
| 280 | - | - Tab management system (browser tabs in addition to panes) | |
| 281 | 244 | - Performance work: faster startup, lower memory, snappier UI | |
| 282 | 245 | - Other shiny things I'm not yet aware of | |
| 283 | 246 | ||
| @@ -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‑First | 14 | + | - **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 | ## Status | 22 | ## 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 & Shortcuts | 25 | ## 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 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 | |||
| 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 homepage | 108 | + | - 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 window | 122 | - 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‑added | 130 | - `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 shortcut | 132 | - `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 date | 134 | - `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 entries | 140 | - `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 statistics | 142 | - `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 Works | 183 | ### 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 panes | 191 | 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 pane | 192 | 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 | ## Configuration | 194 | ## 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 | ## Roadmap | 237 | ## 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 fallback | 239 | - ✅ 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 | |||
| 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 UI | 243 | - 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 UI | 244 | - Performance work: faster startup, lower memory, snappier UI | ||
| 282 | - Other shiny things I'm not yet aware of | 245 | - Other shiny things I'm not yet aware of | ||
| 283 | 246 | ||||
M docs/CONFIG.md +24 -1
| @@ -210,6 +210,28 @@ cancel = ["escape"] | |||
| 210 | 210 | ||
| 211 | 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 | 235 | ### Tab Shortcuts | |
| 214 | 236 | ||
| 215 | 237 | | Key | Type | Default | Description | | |
| @@ -240,7 +262,8 @@ cancel = ["escape"] | |||
| 240 | 262 | | `workspace.styling.inactive_border_width` | int | `1` | Inactive pane border width (px) | | |
| 241 | 263 | | `workspace.styling.inactive_border_color` | string | `"@theme_unfocused_bg_color"` | Inactive pane border color | | |
| 242 | 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 | 267 | | `workspace.styling.transition_duration` | int | `120` | Border transition duration (ms) | | |
| 245 | 268 | | `workspace.styling.border_radius` | int | `0` | Border radius (px) | | |
| 246 | 269 | ||
| @@ -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 Shortcuts | 235 | ### 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 | ||||