Keyboard-first browsing on a Mac, without the extension tax

August 20, 2026 · 3 min read

Every keyboard-driven browsing setup I have used before was a negotiation. The extension binds j and k, then a page grabs focus into a search box and your keys start typing into it. You add a site to the blocklist. A single-page app rewrites the DOM and the hint overlay points at elements that no longer exist. You reload. It works again for a while.

None of this is the extension author's fault. An extension runs inside the page, and the page always wins ties.

What changes when the browser owns the keys

Octoweb takes shortcuts at the application layer, before the page ever sees the event — system-wide hotkeys come off CGEventTap, not from JavaScript injected into the document. A page cannot swallow ⌘⇧P, and it cannot break tab cycling by stealing focus.

That single change makes a whole set of bindings safe to rely on:

Keys What happens
⌘⇧P Command palette — tabs and history, fuzzy-matched together
⌘1⌘9 Jump to a pinned fast-access slot
⌃N / ⌃P Next / previous tab, most-recently-used order
⌃D / ⌃U Scroll half a page down / up
⌘F Find in page, highlighted natively
⌘⇧A Toggle the AI sidebar

The palette replaces four separate things

A conventional browser gives you an address bar, a tab switcher, a bookmarks bar, and a history page. They live in different places and behave differently.

The palette collapses them. Type a fragment and it fuzzy-matches across open tabs and history at once, ranked by match quality and how often you actually return to a page. If nothing matches, three action rows are waiting at the bottom: Search Google, Open URL, and Ask AI.

doc.rust-lang.org/book/ch04-01
rust own
  • TABRust ownership — the bookdoc.rust-lang.org⌘1
  • TABOwnership rules cheatsheetgithub.com⌘2
  • HISTORYBorrow checker errors explainedfasterthanli.me⌘3
↵ Open⌘↵ Navigate⌘⇧↵ Ask AI

The Ask AI row (⌘⇧↵) is the small one that changes habits. A half-formed question that would have become a search becomes a question to an agent that can already see the page you are on.

Shell muscle memory transfers

Text inputs across the browser accept the readline bindings you already use: ⌃A and ⌃E to jump to the start and end of a line, ⌃K and ⌃U to delete forwards and backwards. Prompt history in the sidebar works like a shell too — ⌃P and ⌃N walk it, ⌃R searches it backwards, ⌃E accepts the ghost-text completion.

None of this is novel. That is the point: there is nothing new to learn if you already live in a terminal.

Slots beat bookmarks

Bookmarks are for pages you might want someday. Slots are for the four pages you are rereading right now.

Pin one with ⌘⇧1 through ⌘⇧0, jump back with ⌘1 through ⌘9. They persist across restarts and show in a footer bar.

localhost:5173
123456 ⌘⇧1–0 pins · ⌘1–9 jumps

During a focused task the docs, the ticket, the staging environment, and the dashboard each get a digit, and switching between them stops being a thing you think about.

One wrinkle worth knowing: ⌘0 defaults to zoom reset and wins over slot 10. Rebind zoom reset in Settings if you would rather have the slot — ⌘⇧0 still saves to it either way.

Everything is remappable

If a binding is wrong for you, change it in Settings (⌘,). Remaps persist to ~/.config/octoweb/keybindings.json and apply on the very next keystroke — no restart, no reload. The only fixed keys are the +digit slots, which are positional by nature.

The full shortcut reference has all of them.

Octoweb is free and open source, for macOS.

Install it →