Record visual feedback on web apps with voice narration. Get structured markdown + screenshots that Claude Code can read in one shot.
look.cc = "look, Claude Code"
The problem: You spot a bug in your web app. You want to tell Claude Code "fix this." But typing a description is lossy, screenshots are tedious, and Loom videos can't be read by AI. You need a tool that captures what you see, what you click, and what you say — and outputs it in a format Claude Code can actually consume.
look.cc opens a browser, records your mic, captures every click with CSS selectors and screenshots, transcribes your voice with Whisper, and generates a single session.md file you can hand to Claude Code.
npm install -g look.ccThis installs the CLI, downloads Chromium, and adds the /record slash command to Claude Code automatically.
brew install sox # macOS — needed for mic recording
# sudo apt-get install sox # Ubuntu/Debian
export OPENAI_API_KEY=sk-... # for Whisper transcription (or add to .env)/record https://your-app.com
Navigate the browser, click on elements, narrate what's wrong. Click Stop or press Ctrl+C to end. The session feeds directly into your Claude Code conversation.
look.cc start https://your-app.com # record a session
look.cc list # browse past sessions
look.cc open # open latest session in Finderlook.cc start <url> [options]
-o, --output-dir <dir> Base output directory (default: ~/look.cc)
--local-transcribe Use local whisper.cpp instead of OpenAI API
--no-highlight Skip drawing red highlight boxes on screenshots
--max-duration <seconds> Max recording duration (default: 900)
The in-browser recording widget shows:
- Recording timer with blinking red dot
- Stop button to end the session
- Inspect button — toggle to enter element selection mode (hover highlights elements, click marks them with a dashed red outline + badge)
- Mic level visualizer — animated green/yellow/red bars showing your voice is being captured
- Draggable — grab and move the widget anywhere so it doesn't cover content
Click the Inspect button on the widget to toggle element selection:
- Cursor becomes a crosshair
- Hover over any element to see a red outline
- Click to mark it (dashed red outline + ✖ badge persists)
- Click a marked element again to unmark it
- Press Escape to clear all marks and exit inspect mode
- Normal page clicks are blocked while inspect mode is on — no accidental navigation
When you stop:
- Audio is transcribed via Whisper with word-level timestamps
- Transcript is split into small chunks aligned to screenshots (no giant text blobs)
- Clicked/marked elements get red highlight boxes drawn on their nearest screenshot
- A descriptive session title is generated from your transcript (via GPT-4o-mini)
- A visual review page (review.html) opens in your browser showing the full session
- Everything is copied to clipboard with absolute file paths — paste into Claude Code
- Session is saved to
~/look.cc/<date>_<title>/
look.cc list # table of all past sessions with title, date, duration, events
look.cc open # open latest session folder in FinderThe generated session.md is a chronological narrative with screenshots inline at each step:
# Session: 2026-04-11 14:32
**URL:** https://app.example.com
**Duration:** 3m 12s
---
## [00:08] Click — "Apply discount" button
**Selector:** `button:has-text("Apply discount")`
**Element:** `<button class="btn-primary">Apply discount</button>`
> "So when I click this apply discount button, the cart total updates
> but the line item still shows the old price..."

---
## [00:14 → 00:16] Observation (no interaction)
> "The discount is being applied to the total but not to the displayed line item price"

---
## [00:16 → 00:18] Observation (no interaction)
> "which is confusing for the customer"

---
## Console errors during session
- `00:09` — Uncaught TypeError: Cannot read property 'price' of undefined at cart.js:142
## Network errors during session
_(none)_Claude Code gets: CSS selectors to grep for, element HTML, highlighted screenshots showing exactly what you clicked, your narration split into bite-sized chunks aligned to what's on screen, and any runtime errors.
~/look.cc/2026-04-11_143200_fix-cart-discount-bug/
├── session.md # Main file — hand this to Claude Code
├── session.json # Metadata manifest
├── review.html # Visual review page (opens automatically)
├── screenshots/ # Periodic + highlighted screenshots
│ ├── 0001-snap.png
│ ├── hl-0004-snap-evt-abc123.png # red box on clicked element
│ └── ...
├── audio.wav # Raw recording
├── transcript.json # Word-level timestamps from Whisper
└── timeline.json # Raw event data
CLI (Commander.js)
│
├── Browser Recorder (Playwright)
│ ├── addInitScript → click/input listeners + recording widget
│ ├── exposeBinding → instant event capture (zero I/O, no browser blocking)
│ ├── setInterval → periodic screenshots every 2s
│ └── Inspect mode → overlay-based element selection + marking
│
├── Audio Recorder (sox child process)
│ └── mic level monitoring → terminal UI + in-browser visualizer
│
└── On Stop:
├── Whisper API → word-level transcript
├── Aligner → merge events + words, split at screenshot boundaries
├── Highlighter (sharp) → red boxes on nearest screenshots
├── Namer (GPT-4o-mini) → descriptive folder title
├── Review Page → self-contained HTML with inline screenshots
├── Markdown Renderer → session.md
└── Clipboard → absolute file paths, Cmd+V ready
- Periodic screenshots (every 2s) instead of per-event —
page.screenshot()freezes the browser via CDP. Decoupling screenshots from events keeps the browser smooth. - exposeBinding returns instantly — event handlers push data to a queue with zero I/O. The browser never waits for Node.
- Overlay-based inspect mode — a full-screen invisible div intercepts all mouse events during inspect. No modifier keys, no leaked clicks, no browser quirks.
- Transcript chunking at screenshot boundaries — long narration is split into 2-second chunks, each paired with its screenshot. Claude reads step-by-step, not a wall of text.
- Whisper API over local whisper.cpp — avoids a 150MB binary dependency for first-run.
--local-transcribeflag is stubbed for later. - Chronological narrative — Claude reads
session.mdlike a story. Events, transcript, and screenshots are interleaved in time order. - CSS selectors + element HTML inline — so Claude can grep the codebase directly from the feedback.
- Talk naturally — describe what you see, what's wrong, what you expected
- Use Inspect mode to mark specific elements you're referring to
- Drag the widget out of the way if it covers content
- Keep sessions under 5 minutes — focused feedback works best
- Password fields are automatically masked (value + screenshot)
PRs welcome. The codebase is TypeScript, ~1200 lines across 17 files.
git clone https://github.com/DrMatrixx/look.cc
cd look.cc
npm install
npm run dev -- start https://example.comMIT