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
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": {
"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.
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.