Octoweb 0.17: email client, notes, and Chrome extensions

· · 14 min read

Octoweb 0.17.0 is out. The last release put a terminal under the page. This one brings in the two things that still pulled you out of the browser all day: your inbox and your notes. It also runs Chrome extensions, and the terminal now comes back after a restart.

brew upgrade --cask octoweb

Two shortcuts moved

Read this first if your fingers know the old keys:

  • ⌘⇧I now opens Mail. Web Inspector moved to ⌥⌘I, the key Safari and Chrome use for it.
  • ⌘[ and ⌘] in the terminal now step through splits, not tabs. ⌘1–⌘9 still jump to a terminal tab.

Both can be remapped in Settings, like any other binding.

Mail in a pane beside the page

Most mail that needs you points at the web: a pull request to review, a doc to comment on, an invoice to pay, a sign-in link. An email client for Mac in another window means the same loop the terminal had: read, switch, click, switch back.

Press ⌘⇧I and your inbox opens in a pane on the right, next to the page. Links open as tabs in the current workspace, and the full address shows on hover before you click. Press ⌘⇧I again to hide it, or ⌘⇧↵ to make it fill the window, with the conversation list on the left and the thread beside it.

Mail filling the window: the conversation list on the left with New senders, an Accept and Block row, and Important mail, the selected conversation highlighted. On the right, an open thread with two collapsed messages, the latest message expanded, and three attachments

Accounts

Add accounts in Settings (⌘,) → Mail. Type the address and Octoweb picks the provider for gmail.com, icloud.com, me.com, outlook.com, hotmail.com and a few more. For anything else, pick it yourself.

Provider How it signs in
Gmail and Google Workspace Sign in with Google, or an app password (needs 2-Step Verification)
iCloud An app-specific password
Private Email (Namecheap) Your mailbox password
Outlook and Microsoft 365 OAuth through an app you register in Microsoft Entra; Microsoft turned off passwords
Any IMAP server Your password, with the IMAP and SMTP servers you enter

Passwords and sign-in tokens go into the macOS Keychain, never into the config file. Check connection signs in to both IMAP and SMTP and shows the server's answer when it fails.

Google hasn't finished reviewing Octoweb's sign-in yet, so Sign in with Google shows an "unverified app" screen first. Click Advanced to continue, or use an app password until the review is done.

Each account belongs to the workspaces you pick, and a new one starts in the workspace you're in. The inbox, search, notifications and unread count only ever show that workspace's accounts. Work mail stays in the work workspace, and personal mail doesn't follow you into a screen share.

Important first, everything else grouped

The inbox is one list across a workspace's accounts, in two parts:

  • Important is mail from people. Pinned conversations sit at the top.
  • Other is newsletters, receipts and notifications, grouped by sender into one row each, so 40 shop emails take one line.

A message counts as Other when it carries mailing-list headers (List-Unsubscribe, List-Id), says it was sent automatically, or comes from a noreply or notifications address. When the guess is wrong, Move sender to Important (or to Other) on the thread fixes it for that sender from then on.

There's also an optional Gatekeeper, an email screener per account, off by default. Switching it on accepts everyone already in your mail, people you wrote to included. After that, mail from a new sender waits under New senders with Accept and Block buttons. Blocking archives the conversation, and later mail from that sender is archived quietly.

Triage without the mouse

With the pane focused, single keys act on the conversation you're on:

Keys What happens
j / k Next / previous; inside a thread, the next or previous thread
↩ Open
e Done: archive it, on the server too
h Snooze
p / m Pin / mute (mute archives later replies too)
b Block the sender
t Turn it into a task in your notes
u Mark unread
r / a / f Reply / reply all / forward
c Compose
/ Search
x, ⌘A Select one / select all
⌘Z Undo the last action
? All the keys

Done moves mail to All Mail on Gmail and to the archive folder everywhere else. You can name that folder per account; without one, Octoweb finds the server's archive folder or creates Archive. A selection gets a bar with Done, Snooze, Mark read, Pin and To notes, so clearing 30 receipts is ⌘A, then e.

The Other section with a newsletter's issues expanded, three of them selected, and the selection bar at the bottom: 3 selected, with Done, Snooze, Mark read, Pin, To notes and Clear

Coming from Apple Mail? Its chords work too: ⌘R, ⇧⌘R and ⇧⌘F reply, reply all and forward, ⌘N composes, ⌃⌘A archives, ⇧⌘U marks unread, and ⇧⌘D sends.

Every action can be undone. The bar at the bottom offers Undo for 6 seconds, and ⌘Z works until your next action.

Later: snooze email, undo send, send later, remind me

  • Snooze offers Later today, This evening, Tomorrow morning, This weekend, Next week, or a time you pick. Later today, This evening and This weekend appear only while they're still ahead. The conversation comes back marked Back from snooze, or earlier if someone replies.
  • Undo send holds every message for 10 seconds. Undo reopens the draft.
  • Send later uses the same times and lists the message under Sending later with a Cancel button. If Octoweb was closed at that time, the message goes out at the next launch and tells you it went late.
  • Remind me in the composer brings the conversation back marked No reply yet after 1 day, 3 days or a week, if nobody has answered.

The Snooze until menu over an open thread: Later today, Tomorrow morning, This weekend and Next week, each with its date and time, and a field to pick your own

The composer takes plain text with light markdown, quotes the original in replies, and threads properly. Drag files onto it to attach them. Drafts save as you type and survive a restart.

Search

Search runs on a local full-text index, so results show while you type. It understands from:, to:, has:attachment, is:unread, before: and after: with dates as YYYY-MM-DD. The first sync brings in the last 90 days. Press ↩ and Octoweb also asks the servers for older mail, and keeps what it finds. Your mail also turns up in the command palette: type / and a query, and matching mail shows above matching page text.

Attachments and images

Click an attachment and it opens in a preview inside the pane: PDFs, images, and text files such as CSV, JSON and calendar invites. ← and → move between a message's attachments. Other files get a Download button, which saves to Downloads and shows the file in Finder.

An image attachment open in the preview over the mail window, titled 3 of 3, with previous and next arrows, a Download button and a close button

Mail renders the way its sender designed it, remote images included, in a sandbox with no scripts. If you'd rather senders didn't know when you open their mail, turn on Settings → Mail → Block remote images. Images then stay hidden until you click Show for that message, or Always from that sender.

AI is off until you turn it on

The assistant's mail features stay off until you switch on Mail AI in Settings → Mail. With it on, the assistant in the sidebar can summarise a thread (s), pull tasks out of it into your notes, draft a reply in your voice for you to review, sort the inbox into Needs reply, Waiting on others, FYI and Can archive, or turn a plain-language question into a search. Two more switches add a one-line summary to each Important conversation as it arrives, and the sorted brief each morning. Nothing is ever sent for you.

For agents that drive Octoweb over MCP, there are seven new mail tools, so the same server works as a Gmail MCP server or an email MCP server for any IMAP account: mail_search, mail_list_inbox, mail_read_thread, mail_create_draft, mail_show, mail_set_summaries and mail_add_tasks. They work whether or not Mail AI is on, like the rest of the MCP server. An agent sees only the accounts of the workspace it's connected to. It can read, search, and put a draft in the composer, but no tool sends, archives, or deletes mail.

What stays on your Mac

Octoweb talks to your mail provider directly. There's no Octoweb server in between, and the privacy page spells out what's stored where. Synced mail lives in a local database, so it's readable offline, apart from messages over 1 MB, whose body loads when you open them; actions you take offline are queued and sent on reconnect. Snoozes, pins, mutes, sender choices and reminders live only on this Mac, so your phone won't see them. Removing an account deletes its local mail and its Keychain entries, and changes nothing on the server.

New Important mail shows a small notification inside Octoweb, unless the pane is already open on that workspace. Clicking it opens the conversation.

This first version has limits. There's no delete, spam folder, folder or label browsing, rules, or calendar. Only the inbox and Sent are synced, and new mail arrives within seconds over IMAP IDLE.

Markdown notes for each workspace

Every workspace now gets its own notes in the browser: a plain markdown file in ~/Library/Application Support/octoweb/notes/, created the first time you write or capture something. Press ⌘⇧J to open it in the same pane as Mail, which has a tab for each.

The quickest way in is ⌥⌘J on a page. With nothing selected, it adds a task linking to the page. With text selected, it adds the text as a quote with the link under it. Both land under today's date heading, which Octoweb adds when it isn't there yet.

The Notes tab beside the Mail tab: a workspace's markdown notes with date headings, open and ticked tasks, and a quote with its link

The editor stays plain text with a little color: headings, tasks, quotes and links. Click a [ ] to tick it, ⌘↩ turns the current line into a task, and ⌘-click opens a link, switching to its tab if it's already open. The file is the source of truth, so you can open it in any editor, and Octoweb picks up the changes when the pane gets focus. Show file in Finder is in the pane's header.

Mail and notes connect. Press t on a conversation and it becomes a task linked to the thread, and the thread is marked Done. Untick the task and the conversation comes back to the inbox; tick it again and it's Done. ⌘-click the link to open the thread in the Mail tab.

Chrome extensions

Octoweb now runs extensions from the Chrome Web Store, through Apple's own WebKit extension support. That support needs macOS 15.4 or later; on older versions Settings says so, and everything else works as before.

Add one in Settings → Extensions: paste its Web Store address or its 32-character id, or use Add from file… for an unpacked folder, a .crx, a .zip, or a .xpi. Before anything installs, a sheet lists what the extension can use and which sites it can read and change. Toolbar buttons appear in the address bar, popups open as native popovers, and context-menu items show up in the page's right-click menu.

Extensions follow workspaces the way cookies do:

  • Each workspace keeps its own copy and storage. A password manager signed in to your work vault in one workspace doesn't see the personal one.
  • A new extension runs only in the workspace you're in. Settings → Extensions → Runs in adds it to others, or to all workspaces, including future ones.
  • Private tabs run no extensions.

There's no automatic update yet. Adding the same Web Store extension again updates it in place and keeps its data and workspaces. Remove asks you to click twice and deletes its data in every workspace.

The terminal comes back after a restart

In 0.16, quitting Octoweb closed every shell, and the next launch started empty. Now the terminal comes back the way you left it:

  • every tab and split
  • each pane's working directory
  • each pane's recent output, up to 1 MB, with a dim ── restored ── line under it

The shells themselves are new. Programs that were running, and anything you'd set in the shell, are gone, so restart the dev server.

Terminals also belong to workspaces now. Each workspace has its own tabs and splits, and switching away leaves its shells running; switch back and they're as you left them.

Smaller terminal changes:

  • A split starts in the directory of the pane you split from, not in your home folder.
  • Option works as Meta by default, so ⌥F, ⌥B, ⌥D and ⌥⌫ reach the shell as word keys, and ⌥← / ⌥→ jump by word as in Terminal.app. Turn off Option as Meta in Settings to type characters such as ƒ.
  • Appearance in the Terminal section of Settings can keep the terminal Light or Dark whatever the rest of Octoweb uses.
  • If you use Ghostty, the terminal takes Ghostty's colors when its light or dark mode matches your Ghostty theme. Octoweb reads them when it starts.

Smaller changes

  • Hard reload. ⌘⇧R reloads without the cache, so a rebuilt script or stylesheet is fetched fresh.
  • Window titles name the workspace. The title reads [Workspace] Page title, and when the sidebar, terminal, notes or mail has the keyboard, it names that instead. Time trackers that read window titles can now tell your projects apart.
  • Link hints can stay on. With Keep link hints on in Settings → General, ⌘⇧F hints stay through clicks, scrolling and page loads in that tab until you press it again.
  • Addresses with a port open. Typing localhost:5173 now opens http://localhost:5173, and example.com:8080/x or 192.168.1.1:8080 is read as a host and port.
  • A crash with per-site proxies is fixed. With a proxy set up, Octoweb could quit when macOS network settings changed.

For agents driving Octoweb

If you drive Octoweb with an agent over MCP, a few tools got more reliable:

  • Back, forward and reload wait for the page and return its address, title and readiness, instead of answering before anything loaded. Back and forward say so when there's no page to go to.
  • Clicks and key presses that navigate wait too, including route changes in single-page apps.
  • browser_reload takes hard: true to skip the cache, and browser_wait takes networkidle.
  • Background tabs an agent is working in keep rendering. Pages that animate or redraw on every frame no longer freeze because the tab isn't on screen.
  • browser_snapshot finds what's hidden. When the match is inside a closed menu or a collapsed section, the result names the button that opens it.
  • browser_fill_form doesn't submit when a field didn't keep its value.

The full list is on the MCP page.

Upgrade

brew upgrade --cask octoweb

You can also download it from the 0.17.0 release. The complete commit list is in the changelog. For the keyboard, see the shortcut reference, or press ⌘/ in Octoweb for the live list, remaps included.

Don Karter

Don Karter

CEO & Co-founder at Muvon

20+ years in software engineering, the last decade deep in AI systems. Builds Octoweb — a keyboard-first AI browser for macOS on WebKit and Rust. Writes from the trenches: native browser engineering, agents driving real pages over MCP, and what breaks when every action has to be one keystroke away.

Octoweb is free and open source, for macOS.

Install it →