v0.8.0 0fa6785

README.md RawHistoryFolder

Dumber, fully unfeatured unbloated browser for tiling WMs

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).

  • Native GUI via WebKitGTK 6 (GTK4, CGO) with an embedded homepage UI.
  • CLI that parses URLs, supports search shortcuts (e.g., g:query), and integrates with rofi/dmenu.
  • Persistent history and per‑domain zoom levels (SQLite, XDG locations).
  • Configurable via config.json and environment variables, with live reload.

Wayland‑First

  • Dumb on purpose, designed for Wayland window managers (Sway, Hyprland, River, Niri, etc..) it's a tiny companion that interact nicely with your launcher.
  • Uses a native Wayland WebKitGTK-6.0 window; no external browser required and no X11/XWayland dependency.
  • Optimized for dmenu‑style launchers (rofi, fuzzel, wofi) and keyboard‑driven workflows.

Status

  • Very early stage, expect sharp edges and breaking changes, but it works well enough to browse and play with the launcher flows.

Latest Release

  • 0.8.0 (2025-09-17): Migrated injected UI from inline scripts to structured Svelte components with a shared shadow host, plus Tailwind v4 theming, GTK color sync, and refreshed omnibox/find flows.

Features

  • Built‑in browser window (no external browser needed)
  • Content filtering system (early stage UBlock-based filtering with EasyList integration)
  • Hardware video acceleration with automatic GPU detection (VA-API/VDPAU)
  • Custom dumb:// scheme serving embedded frontend assets
  • Keyboard and mouse controls: comprehensive shortcuts and gestures
  • Persistent history with search and stats
  • Per‑domain zoom persistence
  • dmenu‑style launcher integration (rofi, fuzzel) with history and shortcut suggestions

Controls & Shortcuts

Keyboard Shortcuts

Shortcut Action Notes
F12 Open Developer Tools WebKit inspector
Ctrl/Cmd+L Open Omnibox URL/search input with history
Ctrl/Cmd+F Find in Page Search text within current page
Ctrl/Cmd+= Zoom In Firefox-compatible zoom levels
Ctrl/Cmd++ Zoom In Alternative plus key
Ctrl/Cmd+- Zoom Out Works across keyboard layouts
Ctrl/Cmd+0 Reset Zoom Return to 100% zoom
Ctrl/Cmd+Shift+C Copy URL Copy current URL to clipboard with toast
Ctrl/Cmd+R Reload Page Refresh current page
Ctrl/Cmd+Shift+R Hard Reload Refresh ignoring cache
F5 Reload Page Alternative reload key
Alt+← Navigate Back Go to previous page
Alt+→ Navigate Forward Go to next page

Mouse Controls

Action Result Notes
Ctrl+Scroll Up Zoom In Smooth zoom control
Ctrl+Scroll Down Zoom Out Smooth zoom control
Mouse Button 8 Navigate Back Side button (back)
Mouse Button 9 Navigate Forward Side button (forward)
Two-finger Swipe Back/Forward When supported by touchpad

Omnibox/Find Mode (when active)

Shortcut Action Notes
Escape Close overlay Exit omnibox or find mode
Enter Execute/Navigate Navigate to URL or jump to match
Shift+Enter Previous Match Find mode: go to previous match
Alt+Enter Center Match Find mode: center on match, keep open
↑/↓ Arrow Navigate Results Browse suggestions/matches

All zoom changes are automatically persisted per-domain and restored on next visit.

Quick Start

Prerequisites:

  • Go 1.25+
  • Node.js 20+ and npm (for building the embedded TypeScript frontend)
  • For GUI build: WebKitGTK 6 and GTK4 dev packages (examples)
    • Debian/Ubuntu: libwebkitgtk-6.0-dev libgtk-4-dev build-essential
    • Arch: webkitgtk-6.0 gtk4 base-devel

Build options:

  • GUI (default, recommended):
    • make build # builds frontend + Go with -tags=webkit_cgo
    • Run: ./dist/dumber # opens the embedded homepage
  • CLI‑only (no GUI, CGO disabled):
    • make build-no-gui
    • Run: ./dist/dumber-no-gui version

Development:

  • make dev runs go run . (non‑CGO; GUI stubs log to console)
  • make test runs tests; make lint runs golangci‑lint

Install

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:

  • GUI build (default, recommended):
    • Ensure WebKit2GTK/GTK dev packages are installed (see prerequisites)
    • Clone the repo and run make build (builds frontend first, then Go with GUI support)
    • The resulting ./dist/dumber binary includes the native GUI window
  • CLI‑only (no native window):
    • Clone the repo and run make build-no-gui
    • The resulting ./dist/dumber-no-gui binary runs CLI flows with GUI code stubbed

Usage

  • Open a URL or search:
    • dumber browse https://example.com
    • dumber browse example.com # scheme auto‑added
    • dumber browse g:golang # Google search via shortcut
  • Launch the GUI directly:
    • dumber # no args → opens GUI homepage
  • Show version information:
    • dumber version # display version, commit, and build date
  • Launcher integration (dmenu‑style examples):
    • rofi: dumber dmenu | rofi -dmenu -p "Browse: " | dumber dmenu --select
    • fuzzel: dumber dmenu | fuzzel --dmenu -p "Browse: " | dumber dmenu --select
  • Manage browsing history:
    • dumber history # list recent history (default: 20 entries)
    • dumber history list -n 50 # list 50 recent entries
    • dumber history search golang # search history for "golang"
    • dumber history stats # show history statistics
    • dumber history clear # clear all history (with confirmation)
    • dumber history clear --force # clear all history (no confirmation)
  • Clean up data and cache:
    • dumber purge # purge all data (with confirmation)
    • dumber purge --force # purge all data (no confirmation)
    • dumber purge -d -H -c # purge database and both caches
    • dumber purge --browser-data # purge WebKit data (cookies, etc.)
  • Manage logs:
    • dumber logs list # list available log files
    • dumber logs tail # tail current log file
    • dumber logs clean # clean up old log files

Dmenu mode invocation

You can invoke dmenu mode in two ways:

  • Subcommand (recommended): dumber dmenu … and dumber dmenu --select
  • Root flag (generate options only): dumber --dmenu

Note: The root flag path only generates options; for processing a selection (--select), use the dmenu subcommand as the receiving command.

In GUI mode the app serves an embedded homepage via dumb://homepage, and frontend assets under dumb://app/....

Configuration

Dumber follows the XDG Base Directory spec:

  • Config: ~/.config/dumber/config.json
  • Data: ~/.local/share/dumber
  • State: ~/.local/state/dumber (default DB lives here)

A default config.json is created on first run. Config changes are watched and applied at runtime when possible.

Complete Configuration Reference

Database Configuration

"database": {
  "path": "~/.local/state/dumber/history.db",
  "max_connections": 1,
  "max_idle_time": "5m0s",
  "query_timeout": "30s"
}

History Management

"history": {
  "max_entries": 10000,
  "retention_period_days": 365,
  "cleanup_interval_days": 1
}

Search Shortcuts

"search_shortcuts": {
  "g":   { "url": "https://www.google.com/search?q=%s", "description": "Google search" },
  "gh":  { "url": "https://github.com/search?q=%s", "description": "GitHub search" },
  "yt":  { "url": "https://www.youtube.com/results?search_query=%s", "description": "YouTube search" },
  "w":   { "url": "https://en.wikipedia.org/wiki/%s", "description": "Wikipedia search" },
  "ddg": { "url": "https://duckduckgo.com/?q=%s", "description": "DuckDuckGo search" },
  "so":  { "url": "https://stackoverflow.com/search?q=%s", "description": "Stack Overflow search" },
  "r":   { "url": "https://www.reddit.com/search?q=%s", "description": "Reddit search" },
  "npm": { "url": "https://www.npmjs.com/search?q=%s", "description": "npm package search" },
  "go":  { "url": "https://pkg.go.dev/search?q=%s", "description": "Go package search" },
  "mdn": { "url": "https://developer.mozilla.org/en-US/search?q=%s", "description": "MDN Web Docs search" }
}

Dmenu Integration

"dmenu": {
  "max_history_items": 20,
  "show_visit_count": true,
  "show_last_visited": true,
  "history_prefix": "🕒",
  "shortcut_prefix": "🔍",
  "url_prefix": "🌐",
  "date_format": "2006-01-02 15:04",
  "sort_by_visit_count": true
}

Logging Configuration

"logging": {
  "level": "info",
  "format": "text",
  "filename": "",
  "max_size": 100,
  "max_backups": 3,
  "max_age": 7,
  "compress": true
}

Appearance Settings

"appearance": {
  "sans_font": "Fira Sans",
  "serif_font": "Fira Sans", 
  "monospace_font": "Fira Code",
  "default_font_size": 16
}

Rendering Mode (GPU/CPU)

"rendering_mode": "auto"
  • auto: Detect GPU availability and use GPU when available (default)
  • gpu: Force GPU acceleration (Vulkan/OpenGL via GTK4)
  • cpu: Force software rendering

Environment Variables

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

# Database
DUMB_BROWSER_DATABASE_PATH="./browser.db"
DUMB_BROWSER_DATABASE_MAX_CONNECTIONS=5

# Rendering mode (special variable name)
DUMBER_RENDERING_MODE="gpu"

# Dmenu settings
DUMB_BROWSER_DMENU_MAX_HISTORY_ITEMS=50
DUMB_BROWSER_DMENU_SHOW_VISIT_COUNT=false

# Logging
DUMB_BROWSER_LOGGING_LEVEL="debug"
DUMB_BROWSER_LOGGING_FORMAT="json"

CLI Flags

The browse command supports additional runtime flags:

dumber browse --rendering-mode=gpu https://example.com

Building With WebKitGTK 6 (GTK4)

  • The GUI requires building with -tags=webkit_cgo and CGO enabled.
  • Ensure WebKitGTK 6 and GTK4 dev headers are installed (see prerequisites).
  • Make targets handle both frontend and Go build steps:
    • make build-gui (CGO enabled)
    • make build (CGO enabled by default in the Makefile’s main build)

Without the native tag, a stub backend is used: you can still run CLI flows and see logs, but no native window is displayed.

Media (GStreamer) & Hardware Acceleration

WebKitGTK uses GStreamer for media playback. Dumber includes automatic hardware video acceleration support that detects your GPU and configures the appropriate drivers.

Hardware Acceleration Features:

  • Automatic GPU detection (AMD, NVIDIA, Intel)
  • VA-API and VDPAU driver configuration
  • Support for H.264, HEVC, VP9, and AV1 codecs
  • Significantly reduced CPU usage during video streaming

Required packages:

  • Arch Linux:
    • sudo pacman -S gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav gst-plugin-pipewire pipewire pipewire-pulse
    • Hardware accel: gstreamer-vaapi libva-mesa-driver (AMD), libva-vdpau-driver (NVIDIA), intel-media-driver (Intel)
  • Debian/Ubuntu:
    • sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-pipewire
    • Hardware accel: gstreamer1.0-vaapi va-driver-all (covers most GPUs)

Theme and Runtime Updates

  • The homepage and pages respect your system’s light/dark preference.
  • The app updates color‑scheme live when your GTK theme changes (no relaunch needed).

Project Structure

  • main.go: Entry point with CLI/GUI routing
  • internal/app/cli: CLI application logic and Cobra commands
  • internal/app/browser: Browser application logic and WebKit integration
  • internal/cli: Cobra commands (browse, dmenu, version)
  • internal/config: Viper‑backed config, XDG helpers, defaults
  • internal/db: SQLite schema init and sqlc‑generated queries
  • internal/logging: Structured logging system with file rotation
  • services: Application services (parser/history/config/browser)
  • pkg/webkit: WebKit2GTK bindings (CGO and stub implementations)
  • pkg/clipboard: Cross-platform clipboard operations
  • frontend: TypeScript homepage UI bundled into the binary

Security & Privacy

  • History and zoom settings are stored locally in SQLite under XDG state.
  • The tmp/ directory is ignored by Git and kept out of history.

Roadmap

  • ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete)
  • ✅ GPU rendering (Vulkan via GTK4 renderer) with graceful CPU fallback
  • 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work)
  • Full Vim-style motion and keyboard navigation across pages and UI
  • Performance work: faster startup, lower memory, snappier UI
  • Other shiny things I'm not yet aware of

License

This project is licensed under the MIT License. See LICENSE for details.

source
1# Dumber, fully unfeatured unbloated browser for tiling WMs
2
3<p align="center">
4  <img src="assets/logo.svg" alt="Dumber Logo" width="256" height="256" />
5</p>
6
7Dumber 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).
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.
18
19## Status
20- Very early stage, expect sharp edges and breaking changes, but it works well enough to browse and play with the launcher flows.
21
22## Latest Release
23- `0.8.0` (2025-09-17): Migrated injected UI from inline scripts to structured Svelte components with a shared shadow host, plus Tailwind v4 theming, GTK color sync, and refreshed omnibox/find flows.
24
25## Features
26- Built‑in browser window (no external browser needed)
27- Content filtering system (early stage UBlock-based filtering with EasyList integration)
28- Hardware video acceleration with automatic GPU detection (VA-API/VDPAU)
29- Custom `dumb://` scheme serving embedded frontend assets
30- Keyboard and mouse controls: comprehensive shortcuts and gestures
31- Persistent history with search and stats
32- Per‑domain zoom persistence
33- dmenu‑style launcher integration (rofi, fuzzel) with history and shortcut suggestions
34
35## Controls & Shortcuts
36
37### Keyboard Shortcuts
38| Shortcut | Action | Notes |
39|----------|--------|-------|
40| **F12** | Open Developer Tools | WebKit inspector |
41| **Ctrl/Cmd+L** | Open Omnibox | URL/search input with history |
42| **Ctrl/Cmd+F** | Find in Page | Search text within current page |
43| **Ctrl/Cmd+=** | Zoom In | Firefox-compatible zoom levels |
44| **Ctrl/Cmd++** | Zoom In | Alternative plus key |
45| **Ctrl/Cmd+-** | Zoom Out | Works across keyboard layouts |
46| **Ctrl/Cmd+0** | Reset Zoom | Return to 100% zoom |
47| **Ctrl/Cmd+Shift+C** | Copy URL | Copy current URL to clipboard with toast |
48| **Ctrl/Cmd+R** | Reload Page | Refresh current page |
49| **Ctrl/Cmd+Shift+R** | Hard Reload | Refresh ignoring cache |
50| **F5** | Reload Page | Alternative reload key |
51| **Alt+←** | Navigate Back | Go to previous page |
52| **Alt+→** | Navigate Forward | Go to next page |
53
54### Mouse Controls
55| Action | Result | Notes |
56|--------|---------|-------|
57| **Ctrl+Scroll Up** | Zoom In | Smooth zoom control |
58| **Ctrl+Scroll Down** | Zoom Out | Smooth zoom control |
59| **Mouse Button 8** | Navigate Back | Side button (back) |
60| **Mouse Button 9** | Navigate Forward | Side button (forward) |
61| **Two-finger Swipe** | Back/Forward | When supported by touchpad |
62
63### Omnibox/Find Mode (when active)
64| Shortcut | Action | Notes |
65|----------|--------|-------|
66| **Escape** | Close overlay | Exit omnibox or find mode |
67| **Enter** | Execute/Navigate | Navigate to URL or jump to match |
68| **Shift+Enter** | Previous Match | Find mode: go to previous match |
69| **Alt+Enter** | Center Match | Find mode: center on match, keep open |
70| **↑/↓ Arrow** | Navigate Results | Browse suggestions/matches |
71
72All zoom changes are automatically persisted per-domain and restored on next visit.
73
74## Quick Start
75Prerequisites:
76- Go 1.25+
77- Node.js 20+ and npm (for building the embedded TypeScript frontend)
78- For GUI build: WebKitGTK 6 and GTK4 dev packages (examples)
79  - Debian/Ubuntu: `libwebkitgtk-6.0-dev libgtk-4-dev build-essential`
80  - Arch: `webkitgtk-6.0 gtk4 base-devel`
81
82Build options:
83- GUI (default, recommended):
84  - `make build`          # builds frontend + Go with `-tags=webkit_cgo`
85  - Run: `./dist/dumber`  # opens the embedded homepage
86- CLI‑only (no GUI, CGO disabled):
87  - `make build-no-gui`
88  - Run: `./dist/dumber-no-gui version`
89
90Development:
91- `make dev` runs `go run .` (non‑CGO; GUI stubs log to console)
92- `make test` runs tests; `make lint` runs golangci‑lint
93
94## Install
95**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:
96
97- GUI build (default, recommended):
98  - Ensure WebKit2GTK/GTK dev packages are installed (see prerequisites)
99  - Clone the repo and run `make build` (builds frontend first, then Go with GUI support)
100  - The resulting `./dist/dumber` binary includes the native GUI window
101- CLI‑only (no native window):
102  - Clone the repo and run `make build-no-gui`
103  - The resulting `./dist/dumber-no-gui` binary runs CLI flows with GUI code stubbed
104
105## Usage
106- Open a URL or search:
107  - `dumber browse https://example.com`
108  - `dumber browse example.com`        # scheme auto‑added
109  - `dumber browse g:golang`           # Google search via shortcut
110- Launch the GUI directly:
111  - `dumber`                           # no args → opens GUI homepage
112- Show version information:
113  - `dumber version`                   # display version, commit, and build date
114- Launcher integration (dmenu‑style examples):
115  - rofi:   `dumber dmenu | rofi -dmenu -p "Browse: " | dumber dmenu --select`
116  - fuzzel: `dumber dmenu | fuzzel --dmenu -p "Browse: " | dumber dmenu --select`
117- Manage browsing history:
118  - `dumber history`                   # list recent history (default: 20 entries)
119  - `dumber history list -n 50`       # list 50 recent entries
120  - `dumber history search golang`    # search history for "golang"
121  - `dumber history stats`            # show history statistics
122  - `dumber history clear`            # clear all history (with confirmation)
123  - `dumber history clear --force`    # clear all history (no confirmation)
124- Clean up data and cache:
125  - `dumber purge`                        # purge all data (with confirmation)
126  - `dumber purge --force`                # purge all data (no confirmation)
127  - `dumber purge -d -H -c`               # purge database and both caches
128  - `dumber purge --browser-data`         # purge WebKit data (cookies, etc.)
129- Manage logs:
130  - `dumber logs list`                    # list available log files
131  - `dumber logs tail`                    # tail current log file
132  - `dumber logs clean`                   # clean up old log files
133
134### Dmenu mode invocation
135You can invoke dmenu mode in two ways:
136- Subcommand (recommended): `dumber dmenu` … and `dumber dmenu --select`
137- Root flag (generate options only): `dumber --dmenu`
138
139Note: The root flag path only generates options; for processing a selection (`--select`), use the `dmenu` subcommand as the receiving command.
140
141In GUI mode the app serves an embedded homepage via `dumb://homepage`, and frontend assets under `dumb://app/...`.
142
143## Configuration
144
145Dumber follows the XDG Base Directory spec:
146- Config: `~/.config/dumber/config.json`
147- Data:   `~/.local/share/dumber`
148- State:  `~/.local/state/dumber` (default DB lives here)
149
150A default `config.json` is created on first run. Config changes are watched and applied at runtime when possible.
151
152### Complete Configuration Reference
153
154#### Database Configuration
155```json
156"database": {
157  "path": "~/.local/state/dumber/history.db",
158  "max_connections": 1,
159  "max_idle_time": "5m0s",
160  "query_timeout": "30s"
161}
162```
163
164#### History Management
165```json
166"history": {
167  "max_entries": 10000,
168  "retention_period_days": 365,
169  "cleanup_interval_days": 1
170}
171```
172
173#### Search Shortcuts
174```json
175"search_shortcuts": {
176  "g":   { "url": "https://www.google.com/search?q=%s", "description": "Google search" },
177  "gh":  { "url": "https://github.com/search?q=%s", "description": "GitHub search" },
178  "yt":  { "url": "https://www.youtube.com/results?search_query=%s", "description": "YouTube search" },
179  "w":   { "url": "https://en.wikipedia.org/wiki/%s", "description": "Wikipedia search" },
180  "ddg": { "url": "https://duckduckgo.com/?q=%s", "description": "DuckDuckGo search" },
181  "so":  { "url": "https://stackoverflow.com/search?q=%s", "description": "Stack Overflow search" },
182  "r":   { "url": "https://www.reddit.com/search?q=%s", "description": "Reddit search" },
183  "npm": { "url": "https://www.npmjs.com/search?q=%s", "description": "npm package search" },
184  "go":  { "url": "https://pkg.go.dev/search?q=%s", "description": "Go package search" },
185  "mdn": { "url": "https://developer.mozilla.org/en-US/search?q=%s", "description": "MDN Web Docs search" }
186}
187```
188
189#### Dmenu Integration
190```json
191"dmenu": {
192  "max_history_items": 20,
193  "show_visit_count": true,
194  "show_last_visited": true,
195  "history_prefix": "🕒",
196  "shortcut_prefix": "🔍",
197  "url_prefix": "🌐",
198  "date_format": "2006-01-02 15:04",
199  "sort_by_visit_count": true
200}
201```
202
203#### Logging Configuration
204```json
205"logging": {
206  "level": "info",
207  "format": "text",
208  "filename": "",
209  "max_size": 100,
210  "max_backups": 3,
211  "max_age": 7,
212  "compress": true
213}
214```
215
216#### Appearance Settings
217```json
218"appearance": {
219  "sans_font": "Fira Sans",
220  "serif_font": "Fira Sans", 
221  "monospace_font": "Fira Code",
222  "default_font_size": 16
223}
224```
225
226#### Rendering Mode (GPU/CPU)
227```json
228"rendering_mode": "auto"
229```
230- `auto`: Detect GPU availability and use GPU when available (default)
231- `gpu`: Force GPU acceleration (Vulkan/OpenGL via GTK4)
232- `cpu`: Force software rendering
233
234### Environment Variables
235All config values can be overridden with environment variables using the `DUMB_BROWSER_` prefix:
236
237```bash
238# Database
239DUMB_BROWSER_DATABASE_PATH="./browser.db"
240DUMB_BROWSER_DATABASE_MAX_CONNECTIONS=5
241
242# Rendering mode (special variable name)
243DUMBER_RENDERING_MODE="gpu"
244
245# Dmenu settings
246DUMB_BROWSER_DMENU_MAX_HISTORY_ITEMS=50
247DUMB_BROWSER_DMENU_SHOW_VISIT_COUNT=false
248
249# Logging
250DUMB_BROWSER_LOGGING_LEVEL="debug"
251DUMB_BROWSER_LOGGING_FORMAT="json"
252```
253
254### CLI Flags
255The browse command supports additional runtime flags:
256```bash
257dumber browse --rendering-mode=gpu https://example.com
258```
259
260
261## Building With WebKitGTK 6 (GTK4)
262- The GUI requires building with `-tags=webkit_cgo` and CGO enabled.
263- Ensure WebKitGTK 6 and GTK4 dev headers are installed (see prerequisites).
264- Make targets handle both frontend and Go build steps:
265  - `make build-gui` (CGO enabled)
266  - `make build` (CGO enabled by default in the Makefile’s main build)
267
268Without the native tag, a stub backend is used: you can still run CLI flows and see logs, but no native window is displayed.
269
270## Media (GStreamer) & Hardware Acceleration
271
272WebKitGTK uses GStreamer for media playback. Dumber includes automatic hardware video acceleration support that detects your GPU and configures the appropriate drivers.
273
274**Hardware Acceleration Features:**
275- Automatic GPU detection (AMD, NVIDIA, Intel)
276- VA-API and VDPAU driver configuration
277- Support for H.264, HEVC, VP9, and AV1 codecs
278- Significantly reduced CPU usage during video streaming
279
280**Required packages:**
281- Arch Linux:
282  - `sudo pacman -S gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav gst-plugin-pipewire pipewire pipewire-pulse`
283  - Hardware accel: `gstreamer-vaapi libva-mesa-driver` (AMD), `libva-vdpau-driver` (NVIDIA), `intel-media-driver` (Intel)
284- Debian/Ubuntu:
285  - `sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-pipewire`
286  - Hardware accel: `gstreamer1.0-vaapi va-driver-all` (covers most GPUs)
287
288## Theme and Runtime Updates
289- The homepage and pages respect your system’s light/dark preference.
290- The app updates color‑scheme live when your GTK theme changes (no relaunch needed).
291
292## Project Structure
293- `main.go`: Entry point with CLI/GUI routing
294- `internal/app/cli`: CLI application logic and Cobra commands
295- `internal/app/browser`: Browser application logic and WebKit integration
296- `internal/cli`: Cobra commands (`browse`, `dmenu`, `version`)
297- `internal/config`: Viper‑backed config, XDG helpers, defaults
298- `internal/db`: SQLite schema init and sqlc‑generated queries
299- `internal/logging`: Structured logging system with file rotation
300- `services`: Application services (parser/history/config/browser)
301- `pkg/webkit`: WebKit2GTK bindings (CGO and stub implementations)
302- `pkg/clipboard`: Cross-platform clipboard operations
303- `frontend`: TypeScript homepage UI bundled into the binary
304
305## Security & Privacy
306- History and zoom settings are stored locally in SQLite under XDG state.
307- The `tmp/` directory is ignored by Git and kept out of history.
308
309## Roadmap
310- ✅ WebKitGTK 6 (GTK4) migration (GPU/Vulkan path complete)
311- ✅ GPU rendering (Vulkan via GTK4 renderer) with graceful CPU fallback
312- 🚧 UBlock-based content filtering (early stage - network blocking works, cosmetic filtering needs work)
313- Full Vim-style motion and keyboard navigation across pages and UI
314- Performance work: faster startup, lower memory, snappier UI
315- Other shiny things I'm not yet aware of
316
317## License
318This project is licensed under the MIT License. See `LICENSE` for details.

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