Browser Agents Don't Need Better Models. They Need Better Eyes. - Kushan Raj, ARK
Read the talk
Browser Agents Don’t Need Better Models. They Need Better Eyes.
Kushan Raj argues that browser agents often waste capable models on fragmented page views and ambiguous actions. His prototype instead gives the model compact whole-page context and explicit feedback about what changed after each interaction.
From a talk by Kushan Raj
At a glance
Ideas worth remembering
A capable model can still waste time when its browser interface supplies fragmented observations and weak confirmation that actions succeeded.
For the demonstrated page, Raj compares a roughly 20,000-token DOM with an approximately 1,100-token screenshot and an approximately 1,800-token whole-page Markdown representation.
Markdown and screenshots are complementary: one provides compact page-wide structure, while the other preserves rendered visual context.
State deltas—what appeared, disappeared, became unblocked, or failed to change—give the model a clearer recovery signal than repeated screenshots alone.
The examples support an interface-design hypothesis, not a general performance result: the talk provides no controlled success-rate, latency, cost, safety, or information-loss evaluation.
The first click is already too slow
Browser agents should be an obvious convenience, yet Raj opens by admitting that he rarely uses them himself. His first demonstration explains the hesitation: a browser challenge requires 30 sequential steps, but the reference agent spends roughly 10–20 seconds just clicking Start. At that pace, every observation, click, and recovery attempt compounds across the remaining workflow. 0:30
Raj then runs his prototype on the same challenge. It moves faster while using what he describes as a cheaper model. This motivates his central hypothesis: the model may already be capable enough, but the browser environment makes it spend too much time reconstructing what happened. In the slower run, the agent tries to click, fails to understand the result, and begins debugging through more browser observations. 0:48
A better runtime, in Raj’s framing, must let the model plan longer sequences, locate the step where execution failed, and choose its next interaction using a useful representation of the page. He briefly introduces a compressed website representation here, but the recording postpones its concrete token comparison and state-tracking mechanism until after the apparent closing. 1:01
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Visible controls are not enough
Aadhaar download. Raj’s first practical example looks trivial: the desired download button is visible in a screenshot. Yet the demonstrated Claude run stalls after reaching it. From about 46 seconds into that demonstration, it takes another screenshot, scrolls without an evident reason, and continues observing the page. Raj says the full attempt lasts two minutes. Seeing the target once was not enough to establish whether the click worked or what state followed. 1:30
Raj’s prototype completes the corresponding workflow almost immediately after starting. The contrast suggests that browser speed depends on more than visual recognition: the runtime must make action outcomes legible enough that the model can continue instead of repeatedly inspecting the page. This remains a demonstration rather than a controlled evaluation; the talk provides no repeated trials, matched settings, success rates, or latency breakdown. 1:56
Kannada booking site. The next example adds unfamiliar language and form state. Raj wants to book a Sunday trek through a Kannada-language site, and says he is not fluent in Kannada. In the Claude run, the agent cannot select a date and eventually stalls. His prototype selects the control, enters the date, and completes the demonstrated step. 2:08
A date picker exposes the difference between locating an element and understanding an interaction. The agent must know whether a calendar or field became active, whether the selected date persisted, and whether the page accepted the input. Raj’s demonstrations suggest that this transition information is where conventional screenshot-driven behavior becomes brittle, although the talk does not test the approach against authentication challenges, CAPTCHAs, anti-bot defenses, or irreversible actions.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Package the runtime as an API
Raj is considering open-sourcing the project because he does not regard the implementation itself as highly defensible. The product could instead expose the execution command as an API: provide a URL and an intent, let the runtime perform the workflow, and return the result. He also considers offering the same capability through a website or plugin. 2:39
Those delivery options all wrap the same browser runtime, but the talk does not address the operational controls an execution service would need: credential handling, scoped authorization, confirmation before consequential actions, and evidence that the requested task actually completed. Raj closes this portion with the broader goal of making browser agents faster, cheaper, and more reliable enough for routine use. 3:09
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Compress the page, then report the delta
After the apparent closing, the recording returns to the core technical mechanism. Raj compares three representations of one page: a full DOM of roughly 20,000 tokens, a screenshot of about 1,100 tokens, and his Markdown representation of about 1,800 tokens. The Markdown is intended to describe the entire page, while one screenshot shows only the current viewport. Token count and coverage both matter: cheaper whole-page context gives the model a navigational map without forcing it to rediscover off-screen content. 3:24
Raj proposes using the Markdown together with a screenshot. The two representations serve different purposes: Markdown supplies compact page-wide structure, while the screenshot retains rendered visual context. The recording does not explain the extraction algorithm or measure what the compression discards. Layout-dependent meaning, canvas content, nested controls, and other visual state could therefore remain difficult to represent faithfully. 3:34
The runtime also compares browser state across actions. It can report which elements appeared, which disappeared, and whether something blocking a target has been removed. If a click produces no expected change, the model receives that failed transition as feedback instead of having to infer it from another raw screenshot. 3:54
This turns browser operation into a closed loop: observe a compact page state, plan a sequence, execute an interaction, compare the new state with the old one, and either continue or revise the plan. “Better eyes” therefore means more than stronger image recognition. It means showing the model enough of the page and explaining what its actions changed. The recording ends before specifying the action protocol or presenting systematic evaluations, so the prototype supports a promising interface thesis rather than proving that model improvements no longer matter.
The runtime maintains end-to-end page state across interactions.
Whole-page structure and rendered context inform an action plan; state deltas then confirm whether execution worked or needs revision.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
Related talks
- Bringing agents onto the world wide web
Extends the harness-first argument with browser infrastructure, network-request interception, reusable skills, and agent-oriented browser tools.
- Harnesses in AI: A Deep Dive
Examines how deterministic infrastructure, browser-state handling, and verification can improve a model-driven agent loop.
- The Current State of Browser Agents
Provides a broader comparison of screenshot- and DOM-based agents, including authentication, anti-bot defenses, latency, and browser-infrastructure constraints.
Read the complete timestamped transcript
- 0:00
Okay, everyone. I am Kushan.
- 0:02
I worked at Seraphim as a founding
- 0:03
engineer for 2 years. Let's talk about
- 0:05
what I'm interested in right now, and
- 0:06
that is browser agents.
- 0:07
Browser agents as an idea are so cool,
- 0:09
right? The browser agent should go
- 0:11
crazy, right? I personally have not seen
- 0:12
that adoption, and me myself, I don't
- 0:14
use browser agents that much. I've been
- 0:15
exploring that for some time. I've been
- 0:17
trying to understand why that is. So, on
- 0:19
my screen right now, we have the browser
- 0:20
challenge.
- 0:21
But, this is a very interesting
- 0:23
benchmark for browser agents because
- 0:25
there are so many things that you have
- 0:26
to do, long rising sequencing of your
- 0:28
tasks. And this actually reveals, you
- 0:30
know, why browser agents suck. If you
- 0:31
saw at the beginning of the video,
- 0:33
the browser this agent took like maybe
- 0:35
10-20 seconds just to click the start
- 0:37
button. And now, we're on step one.
- 0:38
There are 30 steps, and it has taken so
- 0:40
long just to click one button.
- 0:42
Um so, enough of this. I want to show
- 0:44
you what I've been building. So, same
- 0:45
website.
- 0:47
Um I've tried to sort of replicate the
- 0:48
feeling of seeing what's happening, you
- 0:50
know, you can see what the browser agent
- 0:51
is thinking. But as you can see, it is
- 0:53
so much faster and so much quicker, and
- 0:54
I'm using a much cheaper model, right?
- 0:56
The hypothesis here is models are pretty
- 0:58
smart, but it's the infra around them
- 0:59
that sucks. If you noticed in the video
- 1:01
earlier, maybe I'll put a screenshot,
- 1:03
the agent is trying to debug what's
- 1:05
going on. It's trying to click
- 1:06
something, but it doesn't understand
- 1:07
what's going on. So, my core thesis here
- 1:09
has been
- 1:10
give a nice environment for the agent to
- 1:12
use, right? So, where it can plan long
- 1:13
sequences, it can figure out where it
- 1:15
failed, what is going on, and it can
- 1:17
plan the click correctly. I figured out
- 1:18
is a cool representation which
- 1:20
compresses the website and lets the
- 1:22
agent see the entire page in very few
- 1:24
few tokens. Now, I want to show you some
- 1:26
actual examples. Let's say I want to
- 1:28
download my Aadhaar. Um so, this is
- 1:30
Claude trying to do it. So, I'd assume
- 1:32
that this is very simple for a browser
- 1:33
agent. I take a screenshot, you see the
- 1:34
button right there, click it. Uh but
- 1:36
then, what's interesting is that it got
- 1:38
stuck after this point. So, from 46
- 1:40
seconds until the end of this video, it
- 1:42
took a screenshot, it scrolled for some
- 1:43
reason, it took a screenshot.
- 1:45
Basically, this entire process took 2
- 1:47
minutes, whereas
- 1:49
in my case, in our video,
- 1:55
so, it just boots, and
- 1:57
boom, done.
- 1:58
And that's the beauty of a browser
- 2:00
agent. Just how quick was that? And I'm
- 2:02
using such a cheap model for this.
- 2:03
Another interesting example is So, my
- 2:06
friends and I are going trekking on
- 2:08
on Sunday. I was wondering, you know
- 2:10
what? Because this this site is in
- 2:12
Canada and I am not very fluent in
- 2:13
Canada.
- 2:14
Like it took me some time to figure out
- 2:16
this website. So, I asked Claude like,
- 2:17
"Hey, can you book this for me?" And by
- 2:19
the end of it, it's unable to pick a
- 2:20
date and it just stuck. This is the
- 2:22
video of my agent.
- 2:34
You can see it selects it and
- 2:39
puts in the date and boom, done. Right?
- 2:41
It's so simple and convenient to use in
- 2:43
theory. So, what's next, right? What am
- 2:45
I planning on doing? I'm thinking of
- 2:46
open sourcing this project because again
- 2:48
my this code is not super defensible.
- 2:50
The product that I want to give is again
- 2:52
maybe an API that as you can see we were
- 2:55
running these commands. Maybe I just
- 2:57
want to expose this command as an API.
- 2:59
Give me a URL, give me your intent and I
- 3:01
will execute it for you and give it back
- 3:02
to you and or maybe open this as a
- 3:04
website
- 3:05
or expose this as a plugin. But yeah, so
- 3:08
bottom line is I want to make browser
- 3:10
agents faster, cheaper and more reliable
- 3:13
and just make sure everybody in the
- 3:14
world is using them because they can
- 3:15
just do so much for you.
- 3:17
So yeah, that's the broad idea here.
- 3:19
Thank you for watching.
- 3:24
This
- 3:25
entire
- 3:26
markdown
- 3:28
presents the website, that particular
- 3:30
page. And let's actually do this
- 3:31
interesting comparison, right? Let's go
- 3:33
to AIS. The full DOM for this would be
- 3:35
around 20,000 tokens. But so, let's say
- 3:37
we have this screenshot.
- 3:38
All right, this screenshot's about 1,100
- 3:40
tokens.
- 3:41
My markdown's about 1,800 tokens and
- 3:43
instead in one screenshot where you
- 3:44
could see only one particular snippet,
- 3:46
you can see the entire
- 3:48
website, right? A couple of other things
- 3:50
that it's important to give feedback,
- 3:51
right? So, we say that okay, hey, these
- 3:53
are the new things that have popped up
- 3:54
on the page. This is now gone, right?
- 3:56
And similarly, we can say that you know,
- 3:57
this thing that was blocking up things
- 4:00
that you wanted to click has now been
- 4:01
removed. You know, we give it feedback
- 4:02
that you tried to click this, but that
- 4:03
didn't happen because you know, we're
- 4:04
keeping track of the entire end-to-end
- 4:06
browser
- 4:07
page.
- 4:08
Right? So, all of this together, what I
- 4:10
built is a very clean representation
- 4:12
that that basically compresses the
- 4:13
website, and you can give this along
- 4:14
with the screenshot. It's pretty cheap
- 4:16
token-wise. Um so, the model can reason
- 4:18
really well, and then it can construct
- 4:19
this long sequence of tasks to execute.