Project · Updated 2026-09-24

How Palette Browser is built.

A native Mac browser with a research agent that drives it. This page is the engineering account: what was forked, what was added, what is measured, and what is not done.

The Palette mark

The mark is drawn from its own vector path rather than exported as an image, so it stays crisp at every size. It is the same shape the Palette OS frontend draws.

7.8 MBthe app on disk
1,698nodes in the code graph
4,127edges between them
75clustered communities

The base, and why

Palette Browser is a fork of Search, MIT licensed. It is a native macOS browser built on WebKit, the engine already inside every Mac, which is why the whole app is under 8 MB rather than carrying a second copy of Chromium.

The reason that project was the right base is not the browser. It is the bench: a permission-checked Unix socket, one JSON object per line, that drives tabs appended at the end of the row. Those tabs are never selected, never written to history or the session, and are laid out off screen at 1280×800. An agent can open, read, run JavaScript, click and screenshot without ever taking the window from the person using it.

That is a complete agent surface through a real rendering engine. Pages that refuse plain HTTP clients still work, because nothing here is a scraper.

What the fork changed

ChangeWhy
Auto-update disabledUpstream's feed serves the original project's signed builds. Left on, it would offer to replace Palette Browser with that app.
Bundle id xyz.pltt.browserIts own settings, WebKit store and keychain items, separate from an installed copy of the original.
Name and markMenu bar, Finder, About, welcome, extension messages and the app icon. The icon is drawn from Palette's own vector path.
Window-menu lookupThe bench found the window by a menu item literally titled "Search". Renaming the app broke it; it now reads the bundle name.

Nothing else in the browser was touched, so upstream changes still merge. Their licence and copyright stay in place, and the About panel credits them.

The research agent

Ask a question. The agent plans the searches that would answer it, runs them through the browser, pulls the real links out of the results page with JavaScript, decides which pages are worth the time, opens each in an off-screen tab and reads what actually rendered. A page that renders almost no text is a PDF or a picture, so that one is screenshotted and looked at instead. Then it writes an answer where every claim carries a numbered source.

python3 research/agent.py "질문" --depth 5 --open

It thinks on Palette's own models at llm.pltt.dev: one seat to plan and write, a vision seat to look. No third-party search API and no third-party model, so the question and the pages read never leave Palette's own infrastructure. Every tab it opens, it closes, including when a step fails.

What is measured

One run, 24 September 2026, on the question "한국어 LLM 벤치마크 KMMLU와 CLIcK은 무엇을 측정하고 누가 만들었나?":

StepResult
Queries planned4, mixed Korean and English
Distinct pages found27
Pages read6, two of them PDFs handled by the vision seat
Citations written53, against 6 listed sources

The facts were checked by hand against the KMMLU paper: 45 subjects, 35,030 questions, the author list and affiliations, GPT-4 at 59.95%, KMMLU-HARD at 4,104 questions. All correct.

The more useful result was the failure case. Asked about CLIcK, where the pages it read carried only a passing mention, it reported that mention and then wrote that the developers and methodology were not covered by its sources, instead of filling the gap in. Its figure of 1,995 instances for CLIcK independently matches what Palette's own benchmark harness loads.

Shape of the codebase

The graph above is built with an AST pass over the Swift sources, no language model involved. The most connected symbols are the ones you would expect of a browser, which is a reasonable sign the extraction is honest:

SymbolEdges
Tab160
Browser147
View87
Extensions78

Relations break down as 1,824 references, 1,008 calls, 719 methods, 286 contains, 102 imports and 92 implements.

Not done yet