Loading...
Loading...
Collect structured visual feedback from humans using AnyCap's annotation tool, or create and iterate on diagrams using the interactive whiteboard (Excalidraw). Covers image annotation, URL/web page review with screen recording, video review, audio feedback, and collaborative diagramming with Mermaid input. Use when you need a human to point at things, mark regions, draw on screenshots, review a web page or UI, narrate feedback over a recording, provide any spatially-grounded visual input, create or iterate on architecture diagrams, flowcharts, or wireframes. Also use when you need to present work-in-progress to a human for approval or revision. Trigger on: get feedback, show to user, review UI, annotate, mark up, visual feedback, screen recording, user review, human-in-the-loop, approval flow, interactive review, whiteboard, diagram, draw, flowchart, wireframe, or architecture chart.
npx skill4agent add anycap-ai/anycap anycap-human-interactionRead this entire file before starting. Skipping sections leads to incorrect workflows -- each media type has different capabilities and constraints.
anycap-clianycap-media-productionanycap-cli| Scenario | Best for | Primary artifact | Highlight |
|---|---|---|---|
| URL / Web Page Review | Web pages, local dev servers, live UIs | Screen recording with narration | Browse, annotate, and narrate -- the recording captures everything |
| Image Collaborative Review | Generated images, screenshots, designs | Annotated image with merged feedback | Multiple reviewers annotate simultaneously in real-time |
# Blocking -- opens browser, waits for Done click, outputs result
anycap annotate <target> [-o output.png]
# Non-blocking -- starts background server, returns session info
anycap annotate <target> --no-wait [-o output.png]
# Poll for result after human confirms done
anycap annotate poll --session <session_id>
# Stop background server
anycap annotate stop --session <session_id>
# List all active sessions (useful for recovery after context loss)
anycap annotate list<target>http://https://| Flag | Description |
|---|---|
| Non-blocking mode (recommended for agents) |
| Save annotated image to this path |
| Bind to a fixed port (default: random) |
| Bind address (default: |
--port--port 8888--bind 0.0.0.0127.0.0.1--bind--port# Bind to all interfaces on a fixed port
anycap annotate screenshot.png --no-wait --bind 0.0.0.0 --port 8888http://<server-ip>:8888ssh -L 8888:localhost:8888 user@hosthttp://localhost:8888docker run -p 8888:8888 ...http://localhost:8888--porthttps://yourserver.com/tools/annotate/ -> http://localhost:8888/?token=...sequenceDiagram
participant Agent
participant CLI as AnyCap CLI
participant Human
Agent->>CLI: anycap annotate <target> --no-wait
CLI-->>Agent: {session, url, session_file, poll_command, stop_command}
Agent->>Human: Present URL with guidance
Human->>Human: Annotate, record, click Done
Human->>Agent: Confirms done
Agent->>CLI: poll_command
CLI-->>Agent: Annotations + recording
Agent->>Agent: Process feedback
Agent->>CLI: stop_command--no-wait--no-wait.anycap/annotate/<session_id>.jsonsession_file# List all sessions with their status and recovery commands
anycap annotate listlistpoll_commandstop_commandURL mode is single-user. Recording is the primary feedback artifact (cross-origin iframe prevents annotated screenshot export). Multiple users' cursors and annotations would make the recording confusing. The client name tag and peers indicator are hidden. Only one person should review a URL session at a time.
# Local dev server
anycap annotate http://localhost:3000 --no-wait
# Live URL
anycap annotate https://staging.example.com --no-wait# Poll for result
anycap annotate poll --session <session_id>
# Check if recording exists
RECORDING=$(anycap annotate poll --session <session_id> | jq -r '.recording // empty')
# Analyze the recording with AI video understanding
if [ -n "$RECORDING" ]; then
anycap actions video-read --file "$RECORDING" \
--instruction "List all issues the user pointed out. For each issue, describe what they are looking at, what is wrong, and what they want changed. Include timestamps."
fi
# Also read text annotations
anycap annotate poll --session <session_id> \
| jq -r '.annotations[] | "#\(.id) [\(.type)]: \(.label)"'
# Clean up
anycap annotate stop --session <session_id>Recording may be empty. The Rec button uses the browser'sAPI, which requires the user to grant screen-sharing permission. If the user declines the permission prompt or never clicks Rec, thegetDisplayMediafield will be absent from the poll result. Always check for its existence before attempting video-read. Text annotations are still available regardless.recording
# Round 1: Initial review
anycap annotate http://localhost:3000 --no-wait
# ... human reviews, you poll and analyze ...
anycap annotate stop --session <session_1>
# Apply code changes based on feedback
# ... edit files ...
# Round 2: Verification review
anycap annotate http://localhost:3000 --no-wait
# ... human confirms or gives more feedback ...
anycap annotate stop --session <session_2>.webmanycap actions video-read# General feedback extraction
anycap actions video-read --file <recording_path> \
--instruction "List all issues and desired changes the user described"
# UI-specific review
anycap actions video-read --file <recording_path> \
--instruction "For each UI element the user points at, describe the current state and the desired change"
# Prioritized feedback
anycap actions video-read --file <recording_path> \
--instruction "Categorize the user's feedback by priority (critical, important, nice-to-have)"Note: Multi-user collaboration is available for image, video, and audio modes. URL/iframe mode is single-user only.
anycap-media-production# Single reviewer
anycap annotate hero-banner.png --no-wait -o hero-banner-annotated.png
# Multi-user review -- bind to network so teammates can join
anycap annotate hero-banner.png --no-wait -o hero-banner-annotated.png \
--bind 0.0.0.0 --port 8888# Poll for result
anycap annotate poll --session <session_id>
# Extract annotation labels for image-to-image prompt
anycap annotate poll --session <session_id> \
| jq -r '[.annotations[] | select(.label != "") | "#\(.id): \(.label)"] | join(". ")'
# Apply changes via image-to-image
anycap image generate \
--prompt "<annotations as prompt>. Keep all other elements unchanged." \
--model <model-id> \
--mode image-to-image \
--param images=./hero-banner-annotated.png \
-o hero-banner-v2.png
# Clean up
anycap annotate stop --session <session_id>anycap annotate output.mp4 --no-wait# Poll for result
anycap annotate poll --session <session_id>
# The annotated_image is a snapshot of the paused frame with annotations
# Read the annotations for spatial feedback on that frame
anycap annotate poll --session <session_id> \
| jq -r '.annotations[] | "#\(.id) [\(.type)]: \(.label)"'
# If recording exists, analyze it for time-specific feedback
RECORDING=$(anycap annotate poll --session <session_id> | jq -r '.recording // empty')
if [ -n "$RECORDING" ]; then
anycap actions video-read --file "$RECORDING" \
--instruction "What feedback did the user give about the video? For each issue, note the timestamp in the original video, what is wrong, and what they want changed."
fi
# Clean up
anycap annotate stop --session <session_id>anycap annotate track.mp3 --no-wait# Poll for result
anycap annotate poll --session <session_id>
# Read annotation labels -- these describe desired audio changes
anycap annotate poll --session <session_id> \
| jq -r '.annotations[] | "#\(.id) [\(.type)]: \(.label)"'
# If recording exists, analyze the narrated feedback
RECORDING=$(anycap annotate poll --session <session_id> | jq -r '.recording // empty')
if [ -n "$RECORDING" ]; then
anycap actions video-read --file "$RECORDING" \
--instruction "What audio changes did the user request? Note any specific time ranges or sections they mentioned."
fi
# Clean up
anycap annotate stop --session <session_id>graph TD
A[Agent produces work] --> B[Start annotation session]
B --> C[Human reviews and annotates]
C --> D[Agent collects feedback]
D --> E[Agent applies changes]
E --> F{More changes needed?}
F -->|Yes| B
F -->|No| G[Deliver final result]v1v2v3| Situation | Scenario | Why |
|---|---|---|
| Built/modified a web page | URL Review (single-user) | Recording captures browsing, scrolling, and narrated feedback |
| Local dev server needs review | URL Review (single-user) | Same as above -- use |
| Generated image needs edits | Image Review | Annotated image feeds directly into image-to-image editing |
| Team needs to review a design | Image Review (multi-user) | Everyone annotates together, all feedback in one place |
| Design critique with stakeholders | Image Review (multi-user) | Real-time cursors and annotations keep everyone aligned |
| Generated video needs feedback | Video Review | Pause at key moments to annotate specific frames |
| Music/audio needs feedback | Audio Review | Annotate the canvas to mark time regions |
| Need to create/iterate on diagrams | Use | Interactive whiteboard with Mermaid input, agent can push updates |
| Architecture chart needs human input | Use | Collaborative Excalidraw editor with real-time sync |