← Index

Silo

Silo is a browser with Arc-style spaces. Personal and Work sit in one window, each with its own cookie jar, and switching between them never opens a second window.

I built it because Chrome already does the isolation part and does the window part wrong. A Chrome profile is one window. Switch profiles and you get another one, and now you are managing windows instead of contexts.

Chrome Window Profile A Window Profile B switching opens a window Silo One window persist:personal persist:work persist:whatever you add switching swaps the jar
A space is a storage partition, not a profile. That one substitution is the whole project.

A profile in Chromium carries preferences, extensions, a disk path and usually one partition. A partition is just the jar: cookies, localStorage, IndexedDB, cache. Spaces only ever needed the jar, and asking for less is what lets them live in one window. ask for less, get more

Where it attaches

BaseWindow one native window, frameless on every platform Sidebar the chrome defaultSession WebContentsView one per tab bound to persist:<space>
Chrome UI runs on the default session. Page content never touches it, and the page itself is a rounded card floating over the sidebar.

Looking like a browser

Most of the fiddly work came from a single requirement, which is that the thing has to convince other people's sites that it is a browser.

Every partition reports a plain Chrome user agent and a matching client-hints brand list, with no Electron token anywhere, because Google and Microsoft and Apple sign-in all reject an embedded browser. Anything that looks like an auth flow gets a real popup window rather than a tab, because sign-in pages need a live opener to talk back to. Everything else that calls window.open gets a tab.

The window is frameless everywhere, which was not a style choice. On macOS 26 both of the hidden title bar modes still reserve a strip that paints as a band across the top of the chrome, and the vibrancy on it samples the desktop, so the palette ends up depending on the user's wallpaper.

Packaging had its own version of this. The bundle gets ad-hoc signed at the end of the build, because on Apple Silicon a bundle you have renamed and rearranged has a broken signature, and a broken signature is killed on launch rather than warned about.

What's there

It runs, and it packages into a real .app you can drag to Applications. Spaces, pinned tabs and tab URLs persist. The keyboard map is the one your hands already know.

The isolation claim is testable rather than asserted. A pinned tab in the first space writes a cookie, the second space reads nothing, the first space still has it. There is an automated version of the same check, which is the one I actually trust.

Two backdrops, because at some point I wanted to draw a koi pond in SVG and nobody was going to stop me. Colour is token-driven, and the accent is per space with the text on it flipping between dark and light depending on which one clears contrast.