detached d15a2cb

docs(readme): refresh project presentation

commit
d15a2cb5fa43c868fcab6bf4114c55002c6c769f
author
brice · · 2026-08-14 01:43 UTC
committer
brice · · 2026-08-14 01:51 UTC
parent
1ee1a70
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
4 files · +28 -21
M README.md +15 -8
@@ -1,6 +1,15 @@
1-# Dumber
1+<h1 align="center">Dumber</h1>
22
3-[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Go Report Card](https://goreportcard.com/badge/github.com/bnema/dumber)](https://goreportcard.com/report/github.com/bnema/dumber)
3+<p align="center">
4+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="License: MIT"></a>
5+ <a href="https://github.com/bnema/dumber/releases"><img src="https://img.shields.io/badge/platform-Linux%20Wayland%20only-blue?style=flat-square" alt="Platform: Linux Wayland only"></a>
6+ <a href="https://github.com/bnema/dumber/commits/main"><img src="https://badgen.net/github/last-commit/bnema/dumber/main?icon=github" alt="Last commit"></a>
7+ <a href="https://github.com/bnema/dumber/stargazers"><img src="https://badgen.net/github/stars/bnema/dumber?icon=github" alt="GitHub stars"></a>
8+</p>
9+
10+<p align="center">A keyboard-driven, pane-based web browser for Linux Wayland.</p>
11+
12+<p align="center"><a href="https://bnema.dev/dumber">Website</a> · <a href="https://bnema.dev/dumber/docs">Documentation</a> · <a href="https://bnema.dev/dumber/docs/reference/keybindings">Keybindings</a></p>
413
514 Dumber is a keyboard-driven web browser, built around panes, workspaces, and modal controls.
615
@@ -8,8 +17,6 @@ Tabs contain workspaces. Workspaces contain panes. Panes can be split, stacked,
817
918 The layout model is inspired by terminal multiplexers such as Zellij and tmux, but applied to web browsing this is particularly suited for Wayland compositors such as Niri or Hyprland.
1019
11-[Website](https://dumber.bnema.dev) · [Documentation](https://dumber.bnema.dev/docs) · [Keybindings](https://dumber.bnema.dev/docs/reference/keybindings)
12-
1320 ## Demo
1421
1522 https://github.com/user-attachments/assets/232822af-08e4-4a74-9416-87f79c96b118
@@ -70,7 +77,7 @@ The browser chrome stays out of the way by default. Open the omnibox when you wa
7077 ### Install script
7178
7279 ```bash
73-curl -fsSL https://dumber.bnema.dev/install | sh
80+curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | sh
7481 dumber browse
7582 ```
7683
@@ -89,7 +96,7 @@ flatpak install --user dumber.flatpak
8996 flatpak run dev.bnema.Dumber browse
9097 ```
9198
92-For dependencies, distribution notes, and troubleshooting, see the [installation documentation](https://dumber.bnema.dev/docs).
99+For dependencies, distribution notes, and troubleshooting, see the [installation documentation](https://bnema.dev/dumber/docs).
93100
94101 ## Keyboard modes
95102
@@ -112,7 +119,7 @@ The floating pane is a temporary browser pane that can be toggled without changi
112119 - Profile shortcuts such as `Alt+G` are optional and configured under `workspace.floating_pane.profiles`.
113120 - Some `Alt+<key>` bindings may conflict with browser-engine shortcuts or desktop-level handlers.
114121
115-See the [floating pane reference](https://dumber.bnema.dev/docs/reference/floating-pane) for setup and behavior details.
122+See the [floating pane reference](https://bnema.dev/dumber/docs/reference/floating-pane) for setup and behavior details.
116123
117124 ## Configuration
118125
@@ -126,7 +133,7 @@ type = "cef"
126133 enabled = true
127134 ```
128135
129-The config reloads while Dumber is running. See the [configuration documentation](https://dumber.bnema.dev/docs) for all options.
136+The config reloads while Dumber is running. See the [configuration documentation](https://bnema.dev/dumber/docs) for all options.
130137
131138 ## Browser engine
132139
@@ -1,6 +1,15 @@
1-# Dumber1+<h1 align="center">Dumber</h1>
2 2
3-[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Go Report Card](https://goreportcard.com/badge/github.com/bnema/dumber)](https://goreportcard.com/report/github.com/bnema/dumber)3+<p align="center">
4+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="License: MIT"></a>
5+ <a href="https://github.com/bnema/dumber/releases"><img src="https://img.shields.io/badge/platform-Linux%20Wayland%20only-blue?style=flat-square" alt="Platform: Linux Wayland only"></a>
6+ <a href="https://github.com/bnema/dumber/commits/main"><img src="https://badgen.net/github/last-commit/bnema/dumber/main?icon=github" alt="Last commit"></a>
7+ <a href="https://github.com/bnema/dumber/stargazers"><img src="https://badgen.net/github/stars/bnema/dumber?icon=github" alt="GitHub stars"></a>
8+</p>
9+
10+<p align="center">A keyboard-driven, pane-based web browser for Linux Wayland.</p>
11+
12+<p align="center"><a href="https://bnema.dev/dumber">Website</a> · <a href="https://bnema.dev/dumber/docs">Documentation</a> · <a href="https://bnema.dev/dumber/docs/reference/keybindings">Keybindings</a></p>
4 13
5 Dumber is a keyboard-driven web browser, built around panes, workspaces, and modal controls.14 Dumber is a keyboard-driven web browser, built around panes, workspaces, and modal controls.
6 15
@@ -8,8 +17,6 @@ Tabs contain workspaces. Workspaces contain panes. Panes can be split, stacked,
8 17
9 The layout model is inspired by terminal multiplexers such as Zellij and tmux, but applied to web browsing this is particularly suited for Wayland compositors such as Niri or Hyprland.18 The layout model is inspired by terminal multiplexers such as Zellij and tmux, but applied to web browsing this is particularly suited for Wayland compositors such as Niri or Hyprland.
10 19
11-[Website](https://dumber.bnema.dev) · [Documentation](https://dumber.bnema.dev/docs) · [Keybindings](https://dumber.bnema.dev/docs/reference/keybindings)
12-
13 ## Demo20 ## Demo
14 21
15 https://github.com/user-attachments/assets/232822af-08e4-4a74-9416-87f79c96b11822 https://github.com/user-attachments/assets/232822af-08e4-4a74-9416-87f79c96b118
@@ -70,7 +77,7 @@ The browser chrome stays out of the way by default. Open the omnibox when you wa
70 ### Install script77 ### Install script
71 78
72 ```bash79 ```bash
73-curl -fsSL https://dumber.bnema.dev/install | sh80+curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | sh
74 dumber browse81 dumber browse
75 ```82 ```
76 83
@@ -89,7 +96,7 @@ flatpak install --user dumber.flatpak
89 flatpak run dev.bnema.Dumber browse96 flatpak run dev.bnema.Dumber browse
90 ```97 ```
91 98
92-For dependencies, distribution notes, and troubleshooting, see the [installation documentation](https://dumber.bnema.dev/docs).99+For dependencies, distribution notes, and troubleshooting, see the [installation documentation](https://bnema.dev/dumber/docs).
93 100
94 ## Keyboard modes101 ## Keyboard modes
95 102
@@ -112,7 +119,7 @@ The floating pane is a temporary browser pane that can be toggled without changi
112 - Profile shortcuts such as `Alt+G` are optional and configured under `workspace.floating_pane.profiles`.119 - Profile shortcuts such as `Alt+G` are optional and configured under `workspace.floating_pane.profiles`.
113 - Some `Alt+<key>` bindings may conflict with browser-engine shortcuts or desktop-level handlers.120 - Some `Alt+<key>` bindings may conflict with browser-engine shortcuts or desktop-level handlers.
114 121
115-See the [floating pane reference](https://dumber.bnema.dev/docs/reference/floating-pane) for setup and behavior details.122+See the [floating pane reference](https://bnema.dev/dumber/docs/reference/floating-pane) for setup and behavior details.
116 123
117 ## Configuration124 ## Configuration
118 125
@@ -126,7 +133,7 @@ type = "cef"
126 enabled = true133 enabled = true
127 ```134 ```
128 135
129-The config reloads while Dumber is running. See the [configuration documentation](https://dumber.bnema.dev/docs) for all options.136+The config reloads while Dumber is running. See the [configuration documentation](https://bnema.dev/dumber/docs) for all options.
130 137
131 ## Browser engine138 ## Browser engine
132 139
M docs/installation.md +4 -4
@@ -3,7 +3,7 @@
33 ## Quick Install (Linux x86_64)
44
55 ```bash
6-curl -fsSL https://dumber.bnema.dev/install | bash
6+curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | bash
77 ```
88
99 Installs to `~/.local/bin` if available, otherwise `/usr/local/bin` (requires sudo).
@@ -13,19 +13,19 @@ Installs to `~/.local/bin` if available, otherwise `/usr/local/bin` (requires su
1313 Install a specific version:
1414
1515 ```bash
16-DUMBER_VERSION=v0.26.2 curl -fsSL https://dumber.bnema.dev/install | bash
16+DUMBER_VERSION=v0.26.2 curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | bash
1717 ```
1818
1919 Install the latest prerelease:
2020
2121 ```bash
22-DUMBER_PRERELEASE=1 curl -fsSL https://dumber.bnema.dev/install | bash
22+DUMBER_PRERELEASE=1 curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | bash
2323 ```
2424
2525 Combine both to install a specific prerelease:
2626
2727 ```bash
28-DUMBER_VERSION=v0.27.0-rc.1 DUMBER_PRERELEASE=1 curl -fsSL https://dumber.bnema.dev/install | bash
28+DUMBER_VERSION=v0.27.0-rc.1 DUMBER_PRERELEASE=1 curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | bash
2929 ```
3030
3131 ## Flatpak
@@ -3,7 +3,7 @@
3 ## Quick Install (Linux x86_64)3 ## Quick Install (Linux x86_64)
4 4
5 ```bash5 ```bash
6-curl -fsSL https://dumber.bnema.dev/install | bash6+curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | bash
7 ```7 ```
8 8
9 Installs to `~/.local/bin` if available, otherwise `/usr/local/bin` (requires sudo).9 Installs to `~/.local/bin` if available, otherwise `/usr/local/bin` (requires sudo).
@@ -13,19 +13,19 @@ Installs to `~/.local/bin` if available, otherwise `/usr/local/bin` (requires su
13 Install a specific version:13 Install a specific version:
14 14
15 ```bash15 ```bash
16-DUMBER_VERSION=v0.26.2 curl -fsSL https://dumber.bnema.dev/install | bash16+DUMBER_VERSION=v0.26.2 curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | bash
17 ```17 ```
18 18
19 Install the latest prerelease:19 Install the latest prerelease:
20 20
21 ```bash21 ```bash
22-DUMBER_PRERELEASE=1 curl -fsSL https://dumber.bnema.dev/install | bash22+DUMBER_PRERELEASE=1 curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | bash
23 ```23 ```
24 24
25 Combine both to install a specific prerelease:25 Combine both to install a specific prerelease:
26 26
27 ```bash27 ```bash
28-DUMBER_VERSION=v0.27.0-rc.1 DUMBER_PRERELEASE=1 curl -fsSL https://dumber.bnema.dev/install | bash28+DUMBER_VERSION=v0.27.0-rc.1 DUMBER_PRERELEASE=1 curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | bash
29 ```29 ```
30 30
31 ## Flatpak31 ## Flatpak
M install.sh +2 -2
@@ -2,8 +2,8 @@
22 set -e
33
44 # Dumber installer script
5-# Usage: curl -fsSL https://dumber.bnema.dev/install | sh
6-# Usage with pre-release: curl -fsSL https://dumber.bnema.dev/install | DUMBER_PRERELEASE=1 sh
5+# Usage: curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | sh
6+# Usage with pre-release: curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | DUMBER_PRERELEASE=1 sh
77
88 REPO="bnema/dumber"
99 VERSION="${DUMBER_VERSION:-latest}"
@@ -2,8 +2,8 @@
2 set -e2 set -e
3 3
4 # Dumber installer script4 # Dumber installer script
5-# Usage: curl -fsSL https://dumber.bnema.dev/install | sh5+# Usage: curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | sh
6-# Usage with pre-release: curl -fsSL https://dumber.bnema.dev/install | DUMBER_PRERELEASE=1 sh6+# Usage with pre-release: curl -fsSL https://raw.githubusercontent.com/bnema/dumber/main/install.sh | DUMBER_PRERELEASE=1 sh
7 7
8 REPO="bnema/dumber"8 REPO="bnema/dumber"
9 VERSION="${DUMBER_VERSION:-latest}"9 VERSION="${DUMBER_VERSION:-latest}"
M internal/ui/component/omnibox_navigation_state_test.go +7 -7
@@ -73,7 +73,7 @@ func TestEffectiveSearchQuery(t *testing.T) {
7373 hasGhost bool
7474 want string
7575 }{
76- {name: "uses typed input when ghost visible", entryText: "dumber.bnema.dev", realInput: "dumb", hasGhost: true, want: "dumb"},
76+ {name: "uses typed input when ghost visible", entryText: "bnema.dev/dumber", realInput: "dumb", hasGhost: true, want: "dumb"},
7777 {name: "falls back to entry when no ghost", entryText: "dumb", realInput: "dumb", hasGhost: false, want: "dumb"},
7878 {name: "uses entry when real input unavailable", entryText: "dumb", realInput: "", hasGhost: true, want: "dumb"},
7979 }
@@ -136,8 +136,8 @@ func TestResolveTargetURLForSelection(t *testing.T) {
136136 {URL: "https://github.com/bnema/dumber/issues"},
137137 }
138138 favorites := []Favorite{
139- {URL: "https://dumber.bnema.dev"},
140- {URL: "https://docs.dumber.bnema.dev"},
139+ {URL: "https://bnema.dev/dumber"},
140+ {URL: "https://bnema.dev/dumber/docs"},
141141 }
142142
143143 tests := []struct {
@@ -148,7 +148,7 @@ func TestResolveTargetURLForSelection(t *testing.T) {
148148 wantURL string
149149 }{
150150 {name: "history index", mode: ViewModeHistory, index: 1, limit: 10, wantURL: "https://github.com/bnema/dumber/pulls"},
151- {name: "favorites index", mode: ViewModeFavorites, index: 0, limit: 10, wantURL: "https://dumber.bnema.dev"},
151+ {name: "favorites index", mode: ViewModeFavorites, index: 0, limit: 10, wantURL: "https://bnema.dev/dumber"},
152152 {name: "invalid index", mode: ViewModeHistory, index: 99, limit: 10, wantURL: ""},
153153 {name: "history index beyond visible limit is hidden", mode: ViewModeHistory, index: 2, limit: 2, wantURL: ""},
154154 {name: "favorites index beyond visible limit is hidden", mode: ViewModeFavorites, index: 1, limit: 1, wantURL: ""},
@@ -170,8 +170,8 @@ func TestSelectedTargetURL(t *testing.T) {
170170 {URL: "https://github.com/bnema/dumber/pulls"},
171171 }
172172 favorites := []Favorite{
173- {URL: "https://dumber.bnema.dev"},
174- {URL: "https://docs.dumber.bnema.dev"},
173+ {URL: "https://bnema.dev/dumber"},
174+ {URL: "https://bnema.dev/dumber/docs"},
175175 }
176176
177177 tests := []struct {
@@ -184,7 +184,7 @@ func TestSelectedTargetURL(t *testing.T) {
184184 }{
185185 {name: "negative index is not explicit selection", mode: ViewModeHistory, index: -1, limit: 10, wantURL: "", wantBool: false},
186186 {name: "history selection is explicit", mode: ViewModeHistory, index: 0, limit: 10, wantURL: "https://github.com/bnema/dumber", wantBool: true},
187- {name: "favorites selection is explicit", mode: ViewModeFavorites, index: 0, limit: 10, wantURL: "https://dumber.bnema.dev", wantBool: true},
187+ {name: "favorites selection is explicit", mode: ViewModeFavorites, index: 0, limit: 10, wantURL: "https://bnema.dev/dumber", wantBool: true},
188188 {name: "hidden history selection is ignored", mode: ViewModeHistory, index: 1, limit: 1, wantURL: "", wantBool: true},
189189 {name: "hidden favorites selection is ignored", mode: ViewModeFavorites, index: 1, limit: 1, wantURL: "", wantBool: true},
190190 }
@@ -73,7 +73,7 @@ func TestEffectiveSearchQuery(t *testing.T) {
73 hasGhost bool73 hasGhost bool
74 want string74 want string
75 }{75 }{
76- {name: "uses typed input when ghost visible", entryText: "dumber.bnema.dev", realInput: "dumb", hasGhost: true, want: "dumb"},76+ {name: "uses typed input when ghost visible", entryText: "bnema.dev/dumber", realInput: "dumb", hasGhost: true, want: "dumb"},
77 {name: "falls back to entry when no ghost", entryText: "dumb", realInput: "dumb", hasGhost: false, want: "dumb"},77 {name: "falls back to entry when no ghost", entryText: "dumb", realInput: "dumb", hasGhost: false, want: "dumb"},
78 {name: "uses entry when real input unavailable", entryText: "dumb", realInput: "", hasGhost: true, want: "dumb"},78 {name: "uses entry when real input unavailable", entryText: "dumb", realInput: "", hasGhost: true, want: "dumb"},
79 }79 }
@@ -136,8 +136,8 @@ func TestResolveTargetURLForSelection(t *testing.T) {
136 {URL: "https://github.com/bnema/dumber/issues"},136 {URL: "https://github.com/bnema/dumber/issues"},
137 }137 }
138 favorites := []Favorite{138 favorites := []Favorite{
139- {URL: "https://dumber.bnema.dev"},139+ {URL: "https://bnema.dev/dumber"},
140- {URL: "https://docs.dumber.bnema.dev"},140+ {URL: "https://bnema.dev/dumber/docs"},
141 }141 }
142 142
143 tests := []struct {143 tests := []struct {
@@ -148,7 +148,7 @@ func TestResolveTargetURLForSelection(t *testing.T) {
148 wantURL string148 wantURL string
149 }{149 }{
150 {name: "history index", mode: ViewModeHistory, index: 1, limit: 10, wantURL: "https://github.com/bnema/dumber/pulls"},150 {name: "history index", mode: ViewModeHistory, index: 1, limit: 10, wantURL: "https://github.com/bnema/dumber/pulls"},
151- {name: "favorites index", mode: ViewModeFavorites, index: 0, limit: 10, wantURL: "https://dumber.bnema.dev"},151+ {name: "favorites index", mode: ViewModeFavorites, index: 0, limit: 10, wantURL: "https://bnema.dev/dumber"},
152 {name: "invalid index", mode: ViewModeHistory, index: 99, limit: 10, wantURL: ""},152 {name: "invalid index", mode: ViewModeHistory, index: 99, limit: 10, wantURL: ""},
153 {name: "history index beyond visible limit is hidden", mode: ViewModeHistory, index: 2, limit: 2, wantURL: ""},153 {name: "history index beyond visible limit is hidden", mode: ViewModeHistory, index: 2, limit: 2, wantURL: ""},
154 {name: "favorites index beyond visible limit is hidden", mode: ViewModeFavorites, index: 1, limit: 1, wantURL: ""},154 {name: "favorites index beyond visible limit is hidden", mode: ViewModeFavorites, index: 1, limit: 1, wantURL: ""},
@@ -170,8 +170,8 @@ func TestSelectedTargetURL(t *testing.T) {
170 {URL: "https://github.com/bnema/dumber/pulls"},170 {URL: "https://github.com/bnema/dumber/pulls"},
171 }171 }
172 favorites := []Favorite{172 favorites := []Favorite{
173- {URL: "https://dumber.bnema.dev"},173+ {URL: "https://bnema.dev/dumber"},
174- {URL: "https://docs.dumber.bnema.dev"},174+ {URL: "https://bnema.dev/dumber/docs"},
175 }175 }
176 176
177 tests := []struct {177 tests := []struct {
@@ -184,7 +184,7 @@ func TestSelectedTargetURL(t *testing.T) {
184 }{184 }{
185 {name: "negative index is not explicit selection", mode: ViewModeHistory, index: -1, limit: 10, wantURL: "", wantBool: false},185 {name: "negative index is not explicit selection", mode: ViewModeHistory, index: -1, limit: 10, wantURL: "", wantBool: false},
186 {name: "history selection is explicit", mode: ViewModeHistory, index: 0, limit: 10, wantURL: "https://github.com/bnema/dumber", wantBool: true},186 {name: "history selection is explicit", mode: ViewModeHistory, index: 0, limit: 10, wantURL: "https://github.com/bnema/dumber", wantBool: true},
187- {name: "favorites selection is explicit", mode: ViewModeFavorites, index: 0, limit: 10, wantURL: "https://dumber.bnema.dev", wantBool: true},187+ {name: "favorites selection is explicit", mode: ViewModeFavorites, index: 0, limit: 10, wantURL: "https://bnema.dev/dumber", wantBool: true},
188 {name: "hidden history selection is ignored", mode: ViewModeHistory, index: 1, limit: 1, wantURL: "", wantBool: true},188 {name: "hidden history selection is ignored", mode: ViewModeHistory, index: 1, limit: 1, wantURL: "", wantBool: true},
189 {name: "hidden favorites selection is ignored", mode: ViewModeFavorites, index: 1, limit: 1, wantURL: "", wantBool: true},189 {name: "hidden favorites selection is ignored", mode: ViewModeFavorites, index: 1, limit: 1, wantURL: "", wantBool: true},
190 }190 }

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