Skip to content

Browsing live pages

web_fetch does a plain HTTP GET. The browse tool opens the URL in a real Chromium and reads the page after its JavaScript has run, which is the only way to read a single-page app or a dashboard.

It is off by default, because driving a real browser is far slower than a fetch. Turn it on in /settings → browser, or:

browser = true
browser_path = "" # only to point at your own copy of the engine
Driving a real browser100×30 · 0:50
For pages that only exist after JavaScript runs: a real Chromium, with the page's interactive elements indexed so the agent can click them.

browse drives agent-browser, a self-contained native binary. The installer fetches it, and if it did not, the first browse call does — one pinned version, checked against a pinned hash before anything is written, unpacked into koda’s own directory. No npm, no Node, nothing to install by hand.

Terminal window
koda browser install # fetch or update it explicitly
koda browser status # which engine koda would use, and where it came from

koda looks for the engine in browser_path first, then its own copy, then your system PATH, then the common locations (/opt/homebrew/bin, ~/.cargo/bin, ~/.npm-global/bin, /usr/local/bin) — so a copy you installed yourself still works.

KODA_AGENT_BROWSER_URL points the download at a mirror for an air-gapped install. The hash check still applies.

browser = true
browser_channel = "chrome" # chrome · msedge · a path · "" for the bundled one
browser_headless = true # false to watch the window

Both are rows in /settings — browser build and browser window.

browser_channel defaults to chrome, so koda drives the Chrome you already have rather than downloading a second browser. An absolute path drives any other Chromium build, which is how Brave or Arc get used:

browser_channel = "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser"

If the browser you named will not start, koda says so and uses the bundled Chromium instead. The point is to read the page, not to fail because a preference could not be met.

Turning browser_headless off opens a real window, which is worth doing when you want to watch what the agent is looking at, or to sign in somewhere first.

The tool takes a url and an optional wait_for CSS selector for a page that fills in late. Only http and https are accepted.

Its description names it as the agent-browser / browser tool, so asking koda to “use browser” or “open this in a browser” finds it, rather than getting a literal answer about having no tool by that name.

What comes back is page text, and the agent is told to treat it as untrusted data rather than instructions.

The stealth browsing stack on the uncensored branch exists so an agent can read pages that block automation — Cloudflare and DataDome-class fingerprinting. It drives your real Google Chrome, non-headless.