arc-sidepanel-api
Arc doesn't implement chrome.sidePanel, so extensions that rely on it silently break. This patches them so they work anyway — and tells you when you don't need it.
- Status
- Shipped
- Year
- 2026
- Role
- · Everything
- TypeScript
- Node
- Chrome Extensions
- Native Messaging
The problem
Arc doesn't implement chrome.sidePanel, and has said it doesn't intend to. Any
extension built on that API — Claude among plenty of others — doesn't error, doesn't
warn, and doesn't do anything: you click the icon and nothing happens, because there's
no surface for it to render into.
Silent failure is the annoying part. Nothing tells you the extension is fine and the browser is the problem.
The part I'm most pleased with: it talks you out of it
Some extensions ship two sidebars — the native chrome.sidePanel one and their own,
rendered straight into the page. Sider and CSS Peeper both do this, and their in-page
version already works in Arc untouched. Patching those swaps a maintained UI for mine,
which is a straight downgrade.
So the patcher detects that case and says so before offering to patch, pointing you at
the extension's own display-mode setting instead. A tool whose first job is to tell you
that you don't need it is a better tool, and detect.js carries its own test suite
precisely because that judgement has to be right.
Two ways to be a side panel
You pick one per extension:
Overlay docks to the right and squeezes the page beside it, the way a real side panel narrows the viewport. Drag its left edge to resize, and the width persists. It works on any page a content script can reach and follows you between tabs.
Split tab opens the panel as an actual browser tab. Drag it into an Arc split once and Arc remembers the layout per space. It resizes with Arc's own divider, and no page's CSP can touch it — but it costs a tab and needs that one manual drag.
How it works
Three packages. core is the patch engine: it detects chrome.sidePanel usage from a
manifest, copies the extension without touching the original, and injects a service
worker shim that intercepts chrome.sidePanel.* calls and routes them to whichever panel
style you chose. native-host is a small Node process registered as a Chrome Native
Messaging host. extension is the settings page you actually use — it lists your
extensions, flags the ones using the API, warns about the ones that don't need patching,
and gives you a style picker and a Patch button.
The hard part
Chromium won't let an extension do any of this, on purpose. Extensions are sandboxed from the filesystem and from each other, and none can install another extension — not with any permission, not for anyone.
So the piece that touches disk is the native host. It's the only component with filesystem access, which keeps the boundary explicit rather than smuggled: the extension asks, the host acts, and the privilege is visible.
One manual step survives and can't be removed — after patching you click "Load Unpacked" yourself. Chromium refuses to let software do that for you, which is correct.
Limits, stated plainly
Arc's Split View is native Arc UI with no extension API behind it, so nothing here can trigger the split for you; split-tab mode just hands Arc a real tab worth splitting.
Patching costs the extension's automatic updates — re-run it after Arc updates the original. It may also change the extension's ID if its manifest didn't pin a signing key, which only matters when a page does a strict origin check. macOS only for now.