remote-screenshot
Skill13 starsChanged 11 months agoMITView on GitHub
Applies only to Claude Code on the web. CLAUDECODEREMOTE must be true; the script refuses to run otherwise and that refusal is correct, not an obstacle to work around. If you are on a local machine, stop and say so — the user can see their own editor, and starting a hidden second Neovim to photograph it helps nobody. Then hand the PNG to the user with SendUserFile. capture.sh shoot prints the exact pxbox.py command to run. Run it. A…
Files
Screenshotting Neovim in the web container
Applies only to Claude Code on the web. CLAUDE_CODE_REMOTE must be true; the script
refuses to run otherwise and that refusal is correct, not an obstacle to work around. If you are
on a local machine, stop and say so — the user can see their own editor, and starting a hidden
second Neovim to photograph it helps nobody.
The sequence
S=scripts/screenshot
$S/capture.sh start --cols 150 --rows 40 lua/vibing/core/utils/git_snapshot.lua
$S/capture.sh keys ':VibingChat right' Enter
$S/capture.sh shoot /tmp/shot.png
python3 $S/pxbox.py /tmp/shot.png --expect-height 798 # (rows - 2) * 21
$S/capture.sh stopThen hand the PNG to the user with SendUserFile.
capture.sh shoot prints the exact pxbox.py command to run. Run it. A capture whose
bottom rows were clipped is a plausible-looking screenshot of a slightly different screen, and
the difference between 21px and 1px of painted height does not survive downscaling — you will
not catch it by looking, and you will describe a statusline that is not in the image. pxbox.py
exits non-zero when the painted region is short.
scripts/screenshot/README.md has the mechanism, the headless_shell trap, and why each
terminal cell is its own element. Read it if something renders wrong.
Do not fabricate the contents
capture-pane returns the actual screen buffer, which is the whole point: the frontmatter,
statusline path and highlighting in the image are Neovim's own output. Two ways to throw that
away, both of which produce an image that lies:
- Writing a transcript into the chat buffer to make it look busy. Text you typed is not the
renderer's output. If a screenshot needs a real assistant turn — tool headers,
### Modified Files, streaming — that costs real tokens, so ask first and say that is what the image shows. - Describing what the screenshot shows without reading it back. Open the PNG and look before you narrate it.
Typing an unsent ## User message is fine and authentic — that is a real editor state a
user reaches by typing.
Housekeeping
start writes a chat into the project's real .vibing/chat/, which is git-ignored, so nothing
lands in a commit. Still run git status before committing, and capture.sh stop when done —
a forgotten session keeps a Neovim alive for the rest of the container's life.
In this repository6 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- ci-gatesSkill
- github-flow-for-claude-on-webSkill
- self-testingSkill
- stacked-pr-mergeSkill
- test-designSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

