yrzhe/claude-skills/appsnap
Claude Code and agent skill by yrzhe/claude-skills
- community
Checking that the SKILL.md file is still in the repository.
Capture a Mac app window as agent context. Use when the user asks to snap, inspect, read, capture, summarize, or work from the current Mac window, a visible app, a selected window, or an app screenshot. Strongly prefer for Appshot-like requests, "what is on this window", "use this app as context", and "grab the window text". SKIP for remote websites/files that can be fetched directly, for controlling the UI, clicking, typing, automating actions, or extracting hidden Google Docs/Sheets/Slides/Gmail canvas text beyond what macOS Accessibility exposes.
Install
npx vskill@latest install yrzhe/claude-skills/appsnapSKILL.md
appsnap
Capture one selected macOS window and return the screenshot plus extracted text as context.
Scope
- Use local macOS APIs only. Do not use network or model calls inside scripts.
- Treat the result as passive context. Do not click, type, or control the app.
- Exception: default auto mode and
--fullpage/{"mode":"fullpage"}may be ACTIVE. Auto hover-picks a
window and scroll-stitches only when a bounded AX probe finds a scrollable area. --visible forces a passive single visible screenshot.
- The screenshot is primary context; you (the consuming agent) read it with your own vision. Accessibility (AX) text is supplementary: its unique value is off-screen / not-scrolled-into-view content. Local OCR is OFF by default — your own vision reads a high-res screenshot more accurately than macOS Vision OCR. Only opt into OCR for non-vision / headless consumers.
- Be honest for canvas-heavy apps (Google Docs, Sheets, Slides, Gmail, many browsers): AX may expose little or no text. In that case
assemble.pyreturnsread_image:trueand you must read the screenshot for the visible content. Off-screen canvas text is not reachable by anyone unless the app exposes it through AX.
One-time setup
Scripts need macOS PyObjC frameworks. Create a venv and install:
Run every script below with <skill-dir>/.venv/bin/python (not the system python3).
Flow
- Check permissions:
``bash python3 <skill-dir>/scripts/check_permissions.py ``
If it exits nonzero, stop and show its one-line stderr guidance.
- Capture a window:
``bash python3 <skill-dir>/scripts/capture.py ``
Stdin is optional. Default is {"mode":"auto"}. Use {"mode":"visible"} for hover-pick without scrolling, {"mode":"fullpage"} to force active scroll-stitching, or {"mode":"frontmost"} only when the user explicitly wants the frontmost window.
- Extract AX text with the capture output:
``bash python3 <skill-dir>/scripts/ax_extract.py ``
Pass {"pid":123,"windowid":456} from the capture JSON. If ax_extract.py is unavailable or returns ax_available:false, continue to OCR.
- Assemble the final bundle (OCR stays off by default):
``bash python3 <skill-dir>/scripts/assemble.py ``
Pass {"capture":{...},"ax":{...},"ocr":null}. To force local OCR for a non-vision consumer, pass {"ocr_requested":true} or set APPSNAP_OCR=1.
- Present the bundle to the current agent and ACT ON
read_image:
- Always surface
image_path(the high-res screenshot) andtext_markdown.
For full-page capture, surface every path in image_paths.
- If
read_imageistrue(AX was thin/absent — common for browsers and
canvas apps), read the screenshot yourself for the visible content; text_markdown only covers what AX exposed.
- If
read_imageisfalse, AX returned the full document;text_markdown
is the primary context and the image is confirmation.
scripts/ocr_fallback.py exists for the opt-in / headless path: pass {"image_path":"<abs png>"}; it recovers visible text only.
Script Contracts
scripts/capture.py
Input:
Output:
For opt-in active full-page mode:
scripts/ax_extract.py
Input:
Output:
scripts/ocr_fallback.py
Input:
Output:
scripts/assemble.py
Input:
Output:
read_image:true ⇒ AX was thin/absent; the consuming agent must read the screenshot. text_source:"image-only" ⇒ no text from AX (and OCR not requested); the screenshot is the only context — this is a valid result, not an error.
Housekeeping
Captures are saved to ~/Pictures/appsnap/ (override with APPSNAP_DIR). The one-shot appsnap.sh prints an in-session reminder when screenshots older than APPSNAP_RETENTION_DAYS (default 7) exist, and appsnap.sh --clean deletes them. When you see that reminder, surface it to the user and offer to run --clean — never auto-delete.
Failure Rules
- Scripts read JSON from stdin and write JSON to stdout.
- Scripts write one-line stderr and exit nonzero on errors.
- If permissions are missing, stop before capture or extraction.
- If both AX and OCR produce no text, report that no text was available and keep the screenshot path as the only usable context.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingplugins/appsnap/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/yrzhe/claude-skills/appsnap)