I shipped Octoweb 0.15.0 nine days after 0.14.0, and it's the largest release since launch: 46 files changed, about 5,100 lines added, and two new MCP tools. Most of it is the kind of change you notice in the first hour. The browser now remembers the text of what you read, reaches links inside a page without a mouse, and opens a private tab from any palette row.
Here's how each piece behaves, including the edges. If you just want the upgrade:
brew upgrade --cask octoweb
The palette has always matched titles and URLs. That works until the thing you remember is a sentence: a price, an error message, a line from a thread. The title was "Pricing | Acme", and you have no idea which of forty tabs from last week it was. That exact moment annoyed me enough to build this.
Start a palette query with / and Octoweb searches the text of the pages you have visited instead of their titles:
⌘⇧P → /team seats annual
Every word has to match, each as a prefix, so /seat also finds "seats". Results come back newest first. Each carries a Text pill and the passage that matched, so you can tell the right page from a lookalike before opening it.
The details decide whether you can trust a feature like this, so here they are:
Agents get the same search. browser_search_history_content returns the title, URL, visit time, and matching snippet, so "find that article about connection pooling I read on Tuesday" becomes one tool call.
Bookmarks pile up, and almost nobody opens one from three years ago. I built Later so it can't turn into that pile.
Press ⌘⇧L to save the current page. Without the keyboard, hover the address bar and click the bookmark icon that appears; it stays lit while the page is saved. Press or click again to take the page back out.
Saved pages sit at the top of the palette before you type anything: up to four of them, each with a Later pill.
Opening a saved page removes it from the queue, because reading it was the point. ⌘W on a Later row in the palette drops it without opening. If you never open it, it drops out on its own after 14 days. Its text stays in page memory, so / still finds it. It just stops asking for your attention.
You can change the window:
later_days = 14 # 0 keeps items forever
Each workspace keeps its own queue. An agent can read it with browser_get_later, and the digest-later workflow (see below) turns everything you saved and never opened into three lines each: what it is, the one thing worth knowing, and whether it still deserves your time.
This was the biggest gap in a keyboard-first browser, and it bothered me the longest. You could reach any tab without a mouse, but not the link halfway down the page.
⌘⇧F puts a short label on every clickable thing in the viewport: links, buttons, form fields, and ARIA controls. Type the label and that element activates.
| Keys | What happens |
|---|---|
| Label letters | Activate that element |
| ⇧ + last letter | Open the link in a new tab instead |
| Backspace | Undo the last letter |
| Esc or ⌘⇧F | Dismiss |
Labels only use the home row, a s d f g h j k l, so your hands never move. When there are nine targets or fewer, each label is one letter. With more, labels are two letters.
A few decisions make it dependable:
In the palette, ⌘⇧↵ now opens whatever is selected in a private tab. That can be an open tab, a history entry, a typed URL, or a search.
A private tab gets its own in-memory WebKit data store. Its cookies, localStorage, and cache are separate from the workspace and disappear when the tab closes. It never writes to history, the session file, the favicon cache, page memory, or the reopen list, and it isn't restored on restart. Popups opened from a private tab stay private too, so a sign-in window can't carry the session back into your normal cookie jar. In the palette, a private tab shows a Private pill.
This change can trip up muscle memory: ⌘⇧↵ used to send the query to the AI sidebar. Ask AI is still a row at the bottom of the palette (select it and press ↵), and the most common case now has a better shortcut, covered next.
⌘⇧K sends the text you have selected to the sidebar and asks the agent to explain it, using the page as context. With nothing selected, it asks about the whole page.
Copying got the same attention, with two shortcuts depending on where the text is going:
| Keys | Nothing selected | With a selection |
|---|---|---|
| ⌘⇧C | The URL | The selection, then the URL under it |
| ⌥⌘C | The whole page as clean Markdown | A Markdown quote with a link to its source |
A quote copied with ⌥⌘C pastes as:
> Each value in Rust has an owner.
— [What is Ownership? - The Rust Programming Language](https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html)
Copying a whole page keeps headings, lists, code blocks, and tables. It puts the title and URL on top, makes links absolute, and skips navigation, headers, footers, and forms. The toast shows the word count, a useful check before you paste a page into a prompt. To get a plain title link, ⌥-click the copy button in the address bar.
⌘⇧M moves the current tab to another workspace. It opens the workspace switcher in a destination-picking mode, with the tab's title at the top and your current workspace left out of the list. The ⌘-digit badges keep their real numbers, so the gap in the sequence is the workspace you are already in.
Know this before you use it: the tab reloads when it arrives. Workspaces keep separate cookie and storage stores, and that isolation is the whole reason they exist. Nothing from the live page can come along, including its back/forward history. If it was the last tab in its old workspace, a fresh tab takes its place.
The switcher (⌘⇧O) now works entirely from the keyboard:
| Keys | Action |
|---|---|
| ⌃N / ⌃P | Move the selection down / up |
| ↵ | Switch to the selected workspace |
| N | New workspace |
| E | Rename the selected workspace |
| D | Delete it (asks first; the last workspace can't be deleted) |
| ⌘1–⌘0 | Jump straight to workspace 1–10 |
The workspace you are in stays highlighted, and the popover opens with the cursor on it, not wherever it was last time.
⌘⇧T reopens the last closed tab. Each workspace remembers its own last 16, so a reopened tab never lands in a workspace it didn't come from. The list isn't kept across restarts, since session restore already brings back whatever was open when you quit. Private tabs never go on it.
The standard navigation keys are bound too: ⌘[ goes back, ⌘] goes forward, ⌘N opens a new tab, and ⌘. stops . Like every other binding, they can be remapped in Settings.
This part of 0.15 is less a single feature and more a direction for the browser, and it's the one I keep thinking about.
The Octoweb tap now ships six browser workflows. A workflow is a multi-step job the assistant runs in the background, in tabs you aren't looking at. Each one ends by checking its own result instead of just claiming success.
| Workflow | Give it | What it does |
|---|---|---|
| watch-page | A URL, and optionally what to watch | Extracts the watched text, diffs it against the previous run, and reports changed or unchanged |
| compare-tabs | A question and the tabs | Builds one table with a row per tab, cites every row by URL, and re-checks every cell against its page |
| summarize-thread | A thread or long article URL | Pulls out key points, disagreements, and quotes, and deletes any quote it can't find word for word on the page |
| fill-form | Hints such as "work email" | Fills the form you're looking at from memory, then re-reads the form to prove it. Never submits |
| cancel-subscription | A service name | Walks the cancel path through the dark patterns and stops before the final button |
| digest-later | An optional focus | Writes three lines per unopened Later page |
The guardrails are what make these safe to hand over. fill-form never touches passwords, card numbers, CVVs, or bank and government ID numbers, and never presses submit. cancel-subscription always picks the cancel or reject option and never an upsell. It stops at the last irreversible control and tells you exactly which button it found. Nothing gets cancelled until you run it again with confirm <service>.
To run one from the sidebar, type /workflow and the dropdown completes the name from the workflows you have installed:
/workflow watch-page https://example.com/pricing the Team plan price
You can also schedule one. The assistant can launch workflows on its own, so a recurring job is just an octomind schedule that names the workflow in plain words:
/schedule add when="9am" every="24h" message="run watch-page on https://example.com/pricing, watching the Team plan price"
Pending routines appear as a ⏱ chip with a count in the sidebar header. Click it to list them. They only fire while Octoweb is running, because the assistant session does the scheduling.
All six rely on a browser-tasks skill that the assistant loads for browser work. Its rules are short and strict:
Two new tools, browser_search_history_content and browser_get_later, take the count from 29 to 31. The bigger change is how carefully the server checks who it talks to and what it hands back.
<untrusted> block: page content, snapshots, console output, and network requests – so an agent that can click and type always knows which bytes came from the page.browser_navigate rejects javascript:, data:, blob:, and file: URLs. It also reports where the page actually landed and how settled it was: ready, live, or partial if the page was still rendering at the 8-second limit.browser_get_page_content returns the first 20,000 characters, plus the total length and an offset to continue from.
One caveat from the MCP post still applies. The Origin check keeps web pages out, but any process running on your machine can still reach a loopback port.
Proactive learning is a background agent. Every 30 minutes it reads your open tabs, your history, and the active page's text, then memorizes what it concludes. People should choose that, not stumble on it later, so new installs now start with it turned off.
If you already use Octoweb, check your setting. Earlier versions had it on by default, and Octoweb writes the whole config file every time it saves a setting. So if you ever changed any setting, your config.toml probably contains proactive_learning = true, and that line still wins over the new default. Open Settings (⌘,) and turn it off if you didn't mean to leave it on.
brew upgrade --cask octoweb
You can also grab the archive for your Mac from the 0.15.0 release. The complete commit list is in the changelog, and every binding lives in the shortcut reference. Octoweb is free and open source, for macOS.
Originally published on the Octoweb blog: https://octoweb.xyz/blog/octoweb-0-15-release