surfs.dev Logo
surfs.dev

Train, build, and deploy
browser agents—fast

The easiest way to build reliable AI agents that actually understand the web.

🏄
< 5min
Drop In Time
🌊
10x faster
Ride Success
☀️
99%+
Perfect Waves
The Wipeout

Most browser agents wipe out before they catch a wave

1

Agents wipe out on real sites—DOM changes break everything like a rogue wave.

2

Training is slow and brittle—you're paddling against the current with no good datasets.

3

Debugging is a nightmare—black box failures leave you lost at sea with zero visibility.

Your Quiver

Everything you need to ride the web

SDK + datasets + eval harness + monitoring. The complete lineup for browser agents.

🏄 SDK

Your surfboard—one SDK to ride any browser framework. Works with Playwright, Puppeteer, or bring your own board.

🌊 Training Data

Pre-charted surf spots—clean datasets of real tasks, ready to train your agents on the perfect waves.

📊 Eval Harness

Know your lineup—benchmark agent performance and compare different approaches to find your sweet spot.

⚡ Monitoring

Live surf report—real-time dashboards for success rates, costs, and failures. Catch issues before they wipe you out.

Drop in with one line

No complex setup. No brittle selectors. Just agents that flow.

agent.ts
import { SurfsAgent } from '@surfs/agent'

// Grab your board and hit the water 🏄
const agent = new SurfsAgent({
  model: "gpt-4",
  trackMetrics: true
})

// Catch the wave—automatic instrumentation built in
await agent.ride({
  task: "Find and add the cheapest red t-shirt to cart",
  url: "https://shop.example.com"
})

// Full visibility—traces, replays, metrics all logged 🌊

Full observability built-in. Ride smoothly, no manual logging required.

Built for the big waves

Real-time surf reports, auto-recovery from wipeouts, and instant replay debugging.

https://dashboard.surfs.dev/agents/run-a3f9e2b8
Perfect Ride Complete 🏄

run_a3f9e2b8 · 47.3s · 12 steps

Success
Tokens
8,734
$0.043
Flow Time
412ms
avg per step
Success
100%
this run
1
goto("https://shop.example.com")
2
click("text=Search")
3
fill("input[name=q]")
12
click("text=Add to cart")