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
| Change | Why |
| Auto-update disabled | Upstream'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.browser | Its own settings, WebKit store and keychain items, separate from an installed copy of the original. |
| Name and mark | Menu bar, Finder, About, welcome, extension messages and the app icon. The icon is drawn from Palette's own vector path. |
| Window-menu lookup | The 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은 무엇을 측정하고
누가 만들었나?":
| Step | Result |
| Queries planned | 4, mixed Korean and English |
| Distinct pages found | 27 |
| Pages read | 6, two of them PDFs handled by the vision seat |
| Citations written | 53, 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:
| Symbol | Edges |
Tab | 160 |
Browser | 147 |
View | 87 |
Extensions | 78 |
Relations break down as 1,824 references, 1,008 calls, 719 methods, 286 contains, 102 imports
and 92 implements.
Not done yet
- A research panel in the app. The agent runs from a terminal today. It is a separate
file precisely so moving it into the window is a UI job, not a rewrite.
- A notarised build. The download is ad-hoc signed, so a first launch needs right-click
then Open. Shipping properly needs a Developer ID Application certificate, which this machine
does not have.
- Wider Korean search coverage, and a judge that scores a source before it is read
rather than after.
- A report store, so past research is searchable from the browser itself.