local · MIT · zero API keys

Give your AI
agent eyes.

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.

Star on GitHub npx agent-eyes <url>
👁 video / frames 🖱 actions 🧾 console 🌐 network +status 🏷 DOM changes
// signature capture

The evidence card

The real silent-failure marker. Left: the frame — a signup form that looks totally fine. Right: the fused timeline that proves it isn't.

MARKER · silent-failure session.json · t=0.347s · frames/f002.jpg
◉ FRAME f002 @ 0.35s
localhost:3000/signup

Create your account

start building in seconds

dev@example.com
••••••••••
Sign up
no error banner · no toast · looks 100% fine ✓
fused timeline · one clock
5 signals aligned → 0.31s to 0.36s
0.312s · 🖱 action
click #submit
button "Sign up"
0.334s · 🌐 network
422 POST /api/signup
Unprocessable Entity
0.341s · 🧾 console
TypeError: cannot read 'id' of undefined
at handleSignup (signup.tsx:42)
0.347s · 🏷 DOM
Ø no change · no nav · no toast
screen identical to f001
🔴 VERDICT · silent-failure
click #submit422 POST /api/signup + JS error → screen did not change. User saw nothing.
ON SCREENlooks fine
ON THE WIREis broken
// pipeline

How it works

Recording is commodity. Detection is the point. Three moves, one command.

01

Record any url

Your localhost, a live site, someone else's page. A real Chromium window opens — click around, or replay steps.json headless.

npx agent-eyes localhost:3000
02

Detect the breaking moment

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.

→ 🔴 silent-failure @ 0.35s
03

Hand the agent frame + error

Markers-first session.json + the pinned frame.jpg become reusable context. Ground truth in, one-shot fix out.

.agent-eyes/session.json
// v0.1 detectors

What it catches

The bugs a console-only agent walks right past. More heuristics — overflow, blank-frame, stuck-spinner, regression — are coming.

🔴 silent-failureFLAGSHIP

An action caused a 4xx/5xx or a JS error — but the UI showed the user nothing. Looks fine, is broken.

click #submit422 POST /api/signup → screen did not change
⚫ dead-clickv0.1

Clicked, and nothing happened. No DOM change, no request, no navigation — a control that just… doesn't.

click .ctaØ no request · Ø no DOM · Ø no nav
👁 visual-reviewv0.1

Points your already vision-capable agent at the frame to eyeball for blank, broken or overlapping UI.

pin frames/f014.jpgagent inspects render
// agent-first

Paste this into your agent

Drop it into Claude Code, Cursor or Codex. The agent runs agent-eyes first, watches the real output, then fixes.

PROMPT.md ⧉ copy
# 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.
no hype · just what it is
🔒
Fully local

Runs on your machine. Node + Playwright + ffmpeg. Nothing leaves your box.

🗝
No API key

Zero accounts, zero tokens, zero cloud. Clone, install, run. MIT licensed.

🌐
Client-side only

Any url captures console / network / DOM / visual. It can't see someone's server.

🎯
Detection is the value

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.