Releases: fcavalcantirj/claude-code-eyes
Release list
v1.1.1 β LAN cameras bypass the proxy
A follow-up to v1.1.0, from the same field report.
LAN cameras are no longer sent through a proxy. A camera on a private address can't be reached through an egress proxy, but snap.sh was still routing to it. snap.sh now passes --noproxy <camera-host> whenever the camera is on a private address. Public hosts keep using the proxy, since for them it may be the only route out.
Relying on no_proxy was not enough, and this is the part worth knowing if you automate anything against a LAN device: CIDR matching in no_proxy only landed in curl 7.86. Older builds ignore no_proxy=192.168.0.0/16 silently β no warning, the request just goes to the proxy anyway. The explicit --noproxy flag works on every version regardless of spelling.
Verified against a real LAN address rather than a loopback fixture, because curl never proxies loopback β a localhost test would have passed either way and proved nothing.
This fixes the common corporate-proxy case. It does not help if your session has no route to the LAN at all (some cloud/bridged setups); nothing in a shell script can fix that, and the README covers the browser workaround for it.
Full changelog: v1.1.0...v1.1.1
v1.1.0 β Claude can zoom the lens
Claude can now drive the camera, not just look through it. When something is too small to read, it zooms in and takes another look instead of guessing.
bash snap.sh --zoom 5 # 5x, capture, then restore the previous zoom
bash snap.sh --focus # trigger autofocus, then capture
bash snap.sh --zoom 6 3 2 # composes with watch mode--zoom is a plain magnification from 1 to 10, snapped to a step your camera actually reports, and the previous level is restored afterwards β a zoomed look never silently changes what the next capture sees. Requires CCE_CAM_TYPE=ipwebcam; other backends say so and still capture.
Thanks to @kookaburra1234 for issue #1, which is where this started.
Also fixed β all three found by people actually running this
snap.sh died instantly with set: pipefail: invalid option name. A git clone on Windows rewrites *.sh to CRLF and bash chokes before reaching your camera. There's now a .gitattributes pinning shell scripts to eol=lf, so a fresh clone can't hit it, and setup.sh detects an already-broken copy. If this bit you, re-clone.
A blocked camera was blamed on the wrong thing. Claude Code's Bash sandbox blocks LAN addresses, but so do cloud/bridged session proxies and corporate proxies β identical 403, completely different fix. snap.sh now dumps the proxy's own verdict (e.g. X-Proxy-Error) and lists the candidates instead of asserting one. Also note sandbox.network.allowedDomains cannot admit a private IP at all; sandbox.excludedCommands is the remedy there.
Frames landed where the Read tool couldn't open them. Sandboxed commands get a different $TMPDIR than the Read tool, so captures go to ./.claude-code-eyes/ (override with CCE_OUT_DIR). Plus a retry, because a dozing Android phone refuses the first connection.
For anyone else automating IP Webcam
Two things cost real debugging time, verified against a physical device:
/ptz?zoom=Pis a percentage 0β100, not a value./ptz?zoom=200doesn't mean 2x β it clamps to maximum zoom. Use/settings/zoom?set=V, absolute over the device's 100β1000 scale.curvals.zoomlags several seconds behind a change, so restoring from an immediate read restores the wrong level.
Success is the response body containing Ok β the status code is 200 either way. And pydroid-ipcam documents zoom as /settings/ptz?zoom=N, which returns 404 on the device tested here.
Full changelog: v1.0.0...v1.1.0
v1.0.0 β claude-code-eyes
Give Claude Code eyes β a camera-vision skill so Claude can SEE real hardware, displays, and wiring: verify a rendered panel, check wiring before power-on, and catch bugs that live on the glass, not the logs.
First public release.
- snap.sh grabs a frame from a snapshot camera (Android IP Webcam, Raspberry Pi camera-streamer, or any snapshot URL) for Claude to read. bash 3.2-safe; config via env / .cce.env / XDG with an allowlisting loader that never sources.
- setup.sh: one-command config + verify, with LAN IP-Webcam auto-scan.
- The disciplines that make it more than a webcam grab: visual-verify, wiring-mentor, and know-what-your-instrument-can-and-cannot-see.
- A 25-second demo + the full story in the README.
MIT. Install: clone into ~/.claude/skills/claude-code-eyes and run setup.sh.