A browser made for agents
Your coding agent opens your web app in Pudu, signs in, clicks through it and tells you what broke. You watch it happen, and take over at any moment.
Free · Pudu 0.5.0 · 1.3 MB · macOS 26 or later
Then add it to your agent's.mcp.json ↓- navigatehttps://github.com2.76s
- clicke90.69s
- fille113 "mcp server"0.51s
- presse113 Enter1.65s
- clicke1660.40s
- clicke2371.44s
Returned4,593 characters
Navigated to a new page.
Elements (28 of 127, those on screen, without 35 the page before had too…):
[e267] button "Sort by: Most stars"
[e274] link "headroomlabs-ai/headroom" -> /headroomlabs-ai/headroom
Against Playwright MCP Pudu Playwright
- Calls
- 6
- 10
- Seconds
- 16.9
- 22.4
- Characters read
- 15.7k
- 162.2k
- Explore GitHub Actions
- Explore Blog
- Explore CI/CD
- Explore Code review
- Search syntax tips
Change is constant.
GitHub keeps you ahead.
- Repositories 167k
- Issues 625k
- Pull requests 3.3M
- Discussions 19.8k
- Best match
- Most stars
- Fewest stars
- Most forks
- Fewest forks
- Recently updated
- Least recently updated
- punkpeye/awesome-mcp-servers★ 96,133
- headroomlabs-ai/headroom★ 75,060
- zylon-ai/private-gpt★ 57,564
A logged run from the measurements: 6 calls in 16.9 s, and 15.7k characters read. The same task on Playwright MCP took 10 calls, 22.4 s and 162.2k characters.
Fast and light
Fewer steps, less time, fewer tokens
Each action tells the agent only what changed on the page, so it reads less and decides sooner. Against Playwright MCP, on six public sites, Pudu took fewer steps, less time and fewer input tokens on all six.
- Steps, six sites
- Pudu42
- Playwright MCP72
- Time, seconds, six sites
- Pudu149.9
- Playwright MCP221.5
- Input tokens, six sites
- Pudu433k
- Playwright MCP1.38M
- Pudu
- Playwright MCP
Steps
- Airbnb
- 611
- Kayak
- 1023
- Booking
- 1215
- MercadoLibre
- 58
- GitHub
- 610
- YouTube
- 35
Time, seconds
- Airbnb
- 24.032.9
- Kayak
- 43.869.8
- Booking
- 28.548.7
- MercadoLibre
- 24.531.2
- GitHub
- 15.521.4
- YouTube
- 13.517.5
Input tokens
- Airbnb
- 58k290k
- Kayak
- 112k644k
- Booking
- 131k201k
- MercadoLibre
- 60k85k
- GitHub
- 48k108k
- YouTube
- 25k56k
The sums are of each site's median. Medians of three runs per site, as of 2026-10-11. Each run is Claude Code on Opus given one task and one browser, Pudu or @playwright/mcp@0.0.83, with no window. Three runs are few: a small difference between two bars says nothing.
The table, with the lowest and highest run
| Site | Browser | Steps | Time, seconds | Input tokens |
|---|---|---|---|---|
| Airbnb | Pudu | 6 4 to 8 | 24.0 22.2 to 28.1 | 58k 42k to 70k |
| Playwright MCP | 11 11 to 11 | 32.9 30.3 to 38.8 | 290k 262k to 291k | |
| Kayak | Pudu | 10 9 to 13 | 43.8 41.9 to 52.9 | 112k 84k to 153k |
| Playwright MCP | 23 22 to 25 | 69.8 63.0 to 69.9 | 644k 554k to 646k | |
| Booking | Pudu | 12 11 to 12 | 28.5 26.8 to 28.7 | 131k 111k to 133k |
| Playwright MCP | 15 14 to 18 | 48.7 43.7 to 52.2 | 201k 199k to 343k | |
| MercadoLibre | Pudu | 5 5 to 6 | 24.5 23.1 to 26.8 | 60k 59k to 78k |
| Playwright MCP | 8 8 to 10 | 31.2 29.4 to 32.2 | 85k 84k to 185k | |
| GitHub | Pudu | 6 6 to 6 | 15.5 15.3 to 16.9 | 48k 48k to 54k |
| Playwright MCP | 10 10 to 10 | 21.4 20.9 to 22.4 | 108k 108k to 108k | |
| YouTube | Pudu | 3 3 to 3 | 13.5 12.4 to 14.5 | 25k 24k to 25k |
| Playwright MCP | 5 5 to 5 | 17.5 16.8 to 20.8 | 56k 55k to 66k |
Isolated
Each profile keeps its own sessions
A profile is a name with its own cookies, logins and storage, kept between runs, so the same test runs as different users of your app. The temporary profile keeps nothing, and it is the one a first launch uses.
An agent can switch to any saved profile without asking. Keep your real accounts out of the profiles you give it.
- temporarykeeps nothing, has no variablesin use
- adminapp.example.com · ${EMAIL} ${PASSWORD}
- customerapp.example.com · ${EMAIL} ${PASSWORD}
- signed-outno variables
+ new profile: name and return
Careful with credentials
Passwords stay in the keychain
A profile holds values such as an email and a password. They are stored in the keychain, each tied to a site, and typed only on pages of that site: a page elsewhere cannot be handed one.
The agent types a value by its name, and the name is what it gets back. That keeps a password out of the conversation; it does not hide it from an agent that goes looking for it in the page.
You can stop the agent at any moment with ⌘. and take over the page yourself.
app.example.com
fill e12 ${PASSWORD}
Typed. The agent gets back ${PASSWORD}, not the value.
example-login.net
fill e7 ${PASSWORD}
The variable ${PASSWORD} belongs to example.com and this window is on example-login.net, so nothing was typed. A variable is typed only on its own site and that site's subdomains.
Flows
Recorded once, replayed without a model
While the agent drives the page, Pudu records what it does as a flow: one JSON file of steps, each finding its element by role and name. Replaying it needs no model, from the window, from the agent or from a terminal.
It exits with 0 when every step passed and 1 when one did not, so it runs in CI. A replay stops at the first step that fails and keeps a screenshot of it. When a button is renamed, the step can still find it by its CSS selector, and says so.
$ pudu run flow.json --var EMAIL=ana@example.com Flow "Sign in": PASSED (5 of 5 steps passed) ✓ 1. navigate https://app.example.com/login ✓ 2. fill textbox "Email" ✓ 3. fill textbox "Password" ✓ 4. click button "Sign in" (its name changed; found by selector) ✓ 5. waitForText Welcome back $ echo $? 0
Install
Give it to your agent
Pudu is a Model Context Protocol server. Add it to your project's .mcp.json and the agent launches it when it needs a browser; it quits when the agent disconnects.
Opened from Finder, it is just a browser.
Free · Pudu 0.5.0 · 1.3 MB · macOS 26 or later
{
"mcpServers": {
"pudu": {
"command": "/Applications/Pudu.app/Contents/MacOS/Pudu"
}
}
}Recently shipped
0.5.0 2026-10-17
- Credentials: a user, a password and an optional 2FA key for one or more sites, kept in the keychain.
- fill types ${name.user}, ${name.password} and ${name.otp}, the six-digit code valid when it is typed.
- list_profiles shows which credentials each profile uses, and never a value.
- Launched by an agent, the app shows no window and stays out of the Dock until the first command.
- A profiles file that cannot be read is no longer overwritten by an empty list.
- A click, fill or press that times out warns that it may still reach the page.
0.4.0 2026-10-15
- network: the fetch and XHR requests the page made, with their status and how long they took.
- An action says which of the page's requests failed while it ran.
- wait_for checks a request's status, where the page landed, that something is gone and that the console has no errors; flows replay those checks.
- repair_flow gives one step of a saved flow a new element, without running it.
- navigate to a file saves it in the session's download folder.
- A page that never stops loading no longer holds a command to its 60 s limit.
0.3.0 2026-10-14
- The window is in English and Spanish, following the system language.
- Safari's Web Inspector opens on the page the agent is driving.
- Development servers on localhost load over https with their own certificate.
- A dialog or notice covering the page is named, with the controls that close it.
- Sign-ins by HTTP Basic or Digest use the site's HTTP_USER and HTTP_PASSWORD.
- Navigations and actions return sooner: a change below the fold no longer holds them.
0.2.0 2026-10-13
- hover, for menus and tooltips that open only under the pointer.
- console: what the page wrote to its console and the errors nothing caught.
- A page the server answered with a 4xx or 5xx says so before its content.
- Form fields say what they ask for: required, their type, a dropdown's options.
0.1.0 2026-10-12
- First release: the window, the MCP server, flows, profiles and the pudu command.
Let your agent open your app
Free · Pudu 0.5.0 · 1.3 MB · macOS 26 or later