Skip to content

Releases: fcavalcantirj/claude-code-eyes

v1.1.1 β€” LAN cameras bypass the proxy

Choose a tag to compare

@fcavalcantirj fcavalcantirj released this 20 Aug 02:37

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

Choose a tag to compare

@fcavalcantirj fcavalcantirj released this 20 Aug 02:29

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=P is a percentage 0–100, not a value. /ptz?zoom=200 doesn't mean 2x β€” it clamps to maximum zoom. Use /settings/zoom?set=V, absolute over the device's 100–1000 scale.
  • curvals.zoom lags 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

Choose a tag to compare

@fcavalcantirj fcavalcantirj released this 21 Jul 20:30

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.