Show HN: Let your AI agents paint big arrows, boxes and text on your screen
bigarrow is an MIT-licensed, single-binary Swift macOS CLI that draws a click-through arrow and sign over all windows so an AI agent can show a human where to click, paste or act (permission prompts, 2FA, OAuth consent). It ships an Agent Skills package (installed via `bigarrow install-skill`) for Claude Code and Codex, with JSON output and exit codes, and can target by Accessibility label, coordinates, window or Peekaboo snapshot. The README documents the skill's token cost (182 tokens for the description, 1,398 for the instructions) and 104 automated tests.
What it claims
bigarrow is a pointer, not an actor: it never clicks, types or captures the screen. One pure-Swift binary (no daemon, menu-bar icon, account or telemetry) draws a labelled arrow in a transparent, click-through window at screen-saver level, across every display and Space. It stays above full-screen apps but never takes keyboard focus. Every arrow removes itself. Drawing needs no macOS permission. Only some targeting modes do.
How it works
- Focus.
NSApplication.run()silently activates a process that has no terminal, which the author calls the project's hardest bug. bigarrow pumps events itself instead, and tests check that the frontmost app never changes. - Clicks. Clicks pass through everywhere except the sign and the shaft. A click on either removes the arrow, which dims under the pointer to signal this.
- Raising the target.
--app App[:window or tab title]brings that app, window, or Chrome/Safari tab to the front first.--no-raisedisables this. If another window later covers the target, the arrow hides until the target is visible again. - Targeting. Options are
--at X,Y,--rect X,Y,W,H,--mouse,--window App[:title],--element Label --app App(Accessibility), or--peekaboo ID --snapshot see.json. Coordinates are global, top-left, logical points;--display Nmakes them relative to one display. - Lifecycle options.
--followtracks a moving window or element.--until-clickends the arrow when the target is clicked.--sayreads the sign aloud.{{value}}in--textbecomes a copy-to-clipboard button.--pngrenders the arrow to an image.--dry-run --jsonreports where it would point without drawing.
How to use it
brew install franzenzenhofer/tap/bigarrow
bigarrow install-skill # teaches Claude Code (~/.claude/skills) and Codex (~/.agents/skills)To build from source (Xcode 16+, macOS 14+), run swift build -c release. The binary lands at .build/release/bigarrow.
bigarrow point --element "Allow" --app "System Settings" --text "Franz, click Allow" # by label
bigarrow point --at 760,500 --text "Franz, click HERE" # by coordinate
bigarrow start --window "Safari:Inbox" --text "This window" && bigarrow stop # until stoppedpointis one-shot.startlasts untilstop.- Every command accepts
--json. - Exit codes: 0 ok, 2 bad input, 3 target not found, 4 permission missing.
bigarrow elements --app Xlists what--elementcan match.bigarrow doctorshows permissions and displays.
Permissions. Accessibility-based targeting needs a permission that macOS grants to the launching app (Terminal, iTerm2, Ghostty, VS Code, Claude), never to bigarrow itself. That host app is the one to enable. Exit code 4 names the app and the settings pane.
Token cost. The skill's description costs 182 tokens and is always loaded. The instructions (1,398 tokens) load only when the agent decides to point. Pane ids and look flags (1,008 more) load only on demand. These counts come from Anthropic's token-count API with Claude Opus 5.5.
Evidence
- 104 automated tests. They cover geometry, placement, a golden image, copy buttons, and recorded window-server, Accessibility and Peekaboo fixtures. They also exercise the real window server for click-through, focus and stop timing.
- Platforms. CI runs macOS 15. The tests also passed on macOS 26 and 27.
- 18 behaviour checks on a clean runner. These include Spaces, Stage Manager, full-screen, second and 2x displays, unplugging a display mid-arrow, and owner exit.
- CPU. 1.4% on a CI runner.
- Agent trial. A fresh agent given only the skill built the correct command to point at Chrome's Reload button. It also surfaced a bug, which is now a test.
Limits
- macOS only.
- Chrome web content. Labels inside Chrome pages are not targetable unless Chrome runs with
--force-renderer-accessibilityor VoiceOver is on (verified October 2026). Without that, point by page coordinates. Electron apps and Chrome's own toolbar work. - No safety boundary. The author states that bigarrow adds nothing beyond what a shell-running agent can already do. Mitigations are tested:
- Boxes and rings are outlines, so the target stays visible.
- The sign keeps clear of the target.
- A click on the sign or shaft dismisses the arrow.
- Every arrow ends by itself.
- Permission scope. Granting Accessibility to your terminal or IDE grants it to everything run from there, not just bigarrow.
Organisations named here
- Anthropic
- OpenAI
- Apple
- NVIDIA
- AMD
- SAP
- Salesforce
- ServiceNow
- Booking.com
- Mercedes-Benz
- SUSE
- Oxide Computer
- Posit
- CoreWeave
- Weights & Biases
- OpenRouter
- Metabase
- InstaDeep
- Benchling
- Stainless
- Under Armour
- Stanford University
- Johns Hopkins University
- KTH
- Oak Ridge National Laboratory
- Claude Code
- Peter Steinberger
Technologies named here
- bigarrow
- Claude Opus 5.5
- Claude Code
- Codex
- Peekaboo
- Nameplate
- Agent Skills format
- Homebrew
- Swift / Xcode
- Agent Skills
- Core Animation
- macOS
- macOS Accessibility API
- Swift
Techniques named here
- Agent-pointing overlay
- Target location via Accessibility labels
- Progressive skill loading
Related in coding-agents
