Install
$ agentstack add skill-brunov21-ferrisgrid-cli-ferrisgrid-use ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README — it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming — see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps — measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
FerrisGrid Use
FerrisGrid is single-step. Do one observe or one action per call, then stop and inspect the Markdown result.
When a task says to use FerrisGrid only, do not use browser automation, page-source fetches, scraping, external search, or host GUI control to inspect or drive the target. Use FerrisGrid observations/actions and inspect the screenshot files returned by FerrisGrid.
If ferrisgrid is not installed on the host, install the published CLI first:
cargo install ferrisgrid-cli
Container Workspace
For the Linux Docker/noVNC workspace, keep the agent terminal on the host and run FerrisGrid inside the container:
docker ps --filter name=ferrisgrid-workspace --format '{{.Names}}:{{.Status}}:{{.Ports}}'
docker exec ferrisgrid-workspace ferrisgrid doctor
docker exec ferrisgrid-workspace ferrisgrid observe --max-image-edge 1280
If the container is not running:
docker run --rm -d --name ferrisgrid-workspace -p 6080:6080 -v "$PWD:/workspace" ferrisgrid-linux-workspace
The human can view the same background desktop at:
http://127.0.0.1:6080/vnc.html?autoconnect=1&resize=scale
Container-specific checks:
- Run
ferrisgrid doctorinside the container before task work; expected backend isnative-linux-x11. - If
.ferrisgrid/was deleted, the nextobserverecreates it automatically. - Use
docker exec ferrisgrid-workspace ferrisgrid ...; do not run hostcargo runwhen the target is the container desktop. - If host
curlto noVNC fails from the sandbox butdocker psshows6080mapped, retry with approved local network access before assuming noVNC is down. - Leave the container running when the user wants to inspect the workspace; stop it only when cleanup is requested.
Observe
Capture all screens by default:
ferrisgrid observe
Capture one screen only:
ferrisgrid observe --screen-id screen-1
Use smaller images for faster LLM vision:
ferrisgrid observe --max-image-edge 1280
Coordinates
- Use
coordinate_mode: normalized-1000. x=0 y=0is the top-left of the target screen.x=1000 y=1000is the bottom-right.- Coordinates are screen-local, not virtual-desktop coordinates.
- If multiple screens are listed, include
screen_id. - Read the returned
screenshot=path and optionalmetadata=path after every call.
Act
Write compact Markdown to an action file, not JSON or prose:
# Update .ferrisgrid/action.md with one compact Markdown action, then run:
ferrisgrid act --file .ferrisgrid/action.md
For the container workspace:
docker exec ferrisgrid-workspace ferrisgrid act --file .ferrisgrid/action.md --max-image-edge 1280
Before each action, replace the whole action block. Do not patch only one field if that can leave duplicate keys such as two x: lines. If in doubt, read the file first:
sed -n '1,80p' .ferrisgrid/action.md
Example .ferrisgrid/action.md:
status: action
action: click
screen_id: screen-1
x: 500
y: 500
button: left
wait_after_ms: 500
Use wait_after_ms on UI-changing actions so FerrisGrid captures the updated UI after the action settles. It waits after executing the action and before taking the returned screenshot. Omit it for pointer moves or actions where an immediate capture is useful. Maximum: 30000.
Suggested wait_after_ms values:
150-300: simple desktop focus changes, opening menus, toggles, hover-triggered UI.300-700: local app tab switches, list selection, expanding rows, lightweight modals.700-1200: browser SPA route changes, message/thread switches, filtered lists, autocomplete results.1200-2500: form submissions, sign-in transitions, search results, uploads that start background work.2500-5000: full page loads, slow web dashboards, OAuth redirects, network-heavy state changes.5000-15000: installers, app launches, downloads, operations that visibly show a progress state.
Useful actions:
status: action
action: click
screen_id: screen-1
x: 742
y: 611
button: left
wait_after_ms: 700
status: action
action: scroll
screen_id: screen-1
x: 500
y: 500
delta_y: -720
wait_after_ms: 300
status: action
action: type
text: hello
status: action
action: press_key
key: enter
wait_after_ms: 1200
Browser Tips
- If a page does not scroll, first click inside the page content, then retry scroll from that area.
- Browser overlays, galleries, and find boxes can capture input; close them before continuing.
- For product pages,
cmd+fwith a price symbol or keyword can jump to hidden details faster than repeated scrolling. Close find withescapebefore reading the final view. - On Linux/X11 use ordinary web shortcuts such as
ctrl+l, not macOScmdshortcuts. - If the address bar is already focused, type the URL directly, then
press_key enter. - On retail sites, dismiss cookie banners before country or location modals if clicks appear to do nothing.
- If a campaign/category feed hides product names or prices, use site search for a broad term to get a normal product grid.
- When grid product names are truncated, open the product detail page to confirm the full name and price.
- FerrisGrid overlays can obscure small text; rely on several screenshots, scroll slightly, or open detail pages rather than guessing.
Troubleshooting
- If
observeworks butactthrough stdin returnsCoreGraphics returned no displays, use the default--file .ferrisgrid/action.mdpath. - If
docker exec ... ferrisgrid observeworks but noVNC is not visible from the host, checkdocker logs ferrisgrid-workspacefor the WebSockify line and confirm port6080is mapped indocker ps. - If Chromium opens smaller than the Xvfb display, check the container entrypoint
--window-sizevalues and verify withxdotool search --onlyvisible --class chromium getwindowgeometry %@. - If input lands in the wrong place, run
xdotool getmouselocationinside the container after amove_mousesmoke test to confirm coordinate mapping.
Loop
- Run
observe. - Inspect returned screenshots.
- Write exactly one action to
.ferrisgrid/action.mdand runact --file, addingwait_after_mswhen the action should change visible UI. - Inspect the post-action screenshot path.
- Repeat until done.
Finish with:
status: done
reason: task complete
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: BrunoV21
- Source: BrunoV21/FerrisGrid-CLI
- License: MIT
- Homepage: https://brunov21.github.io/FerrisGrid-CLI/
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.