Your agent reads the console and guesses. agent-eyes records any url, fuses five signals on one clock, and detects the 1–3 moments that actually break — then hands the agent the exact frame + the error so it stops guessing.
The real silent-failure marker. Left: the frame — a signup form that looks totally fine. Right: the fused timeline that proves it isn't.
start building in seconds
#submit422 POST /api/signupRecording is commodity. Detection is the point. Three moves, one command.
Your localhost, a live site, someone else's page. A real Chromium window opens — click around, or replay steps.json headless.
Five signals fuse on one clock. Detectors flag the 1–3 moments that matter — so the agent jumps to the bug instead of sifting 500 events.
Markers-first session.json + the pinned frame.jpg become reusable context. Ground truth in, one-shot fix out.
The bugs a console-only agent walks right past. More heuristics — overflow, blank-frame, stuck-spinner, regression — are coming.
An action caused a 4xx/5xx or a JS error — but the UI showed the user nothing. Looks fine, is broken.
Clicked, and nothing happened. No DOM change, no request, no navigation — a control that just… doesn't.
Points your already vision-capable agent at the frame to eyeball for blank, broken or overlapping UI.
Drop it into Claude Code, Cursor or Codex. The agent runs agent-eyes first, watches the real output, then fixes.
# Before you edit, LOOK. Don't guess from the console alone. 1. Run the recorder against the page that's misbehaving: npx agent-eyes <url> --auto steps.json --out .agent-eyes # steps.json replays the flow, e.g.: # [{"fill":"#email","value":"dev@x.com"}, # {"fill":"#password","value":"secret"}, # {"click":"#submit"}, {"wait":1200}] 2. Open .agent-eyes/session.json. Read markers[] FIRST — those are the 1–3 moments that actually broke. Ignore the 500-event timeline unless a marker points you into it. 3. For each marker, open the attached frame: .agent-eyes/frames/f###.jpg Correlate: what the user SAW vs what happened on the wire. 4. A silent-failure means: an action hit a 4xx/5xx or threw, but the DOM never changed — the user got NO feedback. Fix BOTH the root cause AND the missing user-visible state. # Ground truth in → one-shot fix out. Fewer tokens, no wrong edits.
Runs on your machine. Node + Playwright + ffmpeg. Nothing leaves your box.
Zero accounts, zero tokens, zero cloud. Clone, install, run. MIT licensed.
Any url captures console / network / DOM / visual. It can't see someone's server.
Recording is commodity. The markers — and the record-anything, run-it-first UX — are the point.
Visual heuristics beyond JS-crash / 5xx are still coming. Not affiliated with Playwright, Cursor, or Anthropic.