Local daemon for macOS
An annotation layer any agent can draw on.
Arin draws on your screen. Agents point at things, highlight regions, and write explanations over MCP or a small JSON protocol. It draws. It never clicks.
brew install anistark/tools/arin
It draws. It never clicks.
Arin never synthesises input. No clicks, no keystrokes, no scrolling. That boundary is the point.
Safe to leave running
A tool that can only render pixels cannot act on your behalf. Agents that need to click should compose Arin with a separate actuator.
No Accessibility permission
Screen Recording is the only permission Arin asks for, and frames are compared in memory rather than written or sent anywhere.
Auditable in an afternoon
Arin holds no model and makes no decisions. The intelligence is your agent. Arin is the chalk.
From tool call to pixels
One round trip, entirely on your machine.
-
01
Your agent decides
A model wants to show you something and calls a tool instead of describing a location in prose.
-
02
Arin places it
Coordinates, a named anchor, or a described target through a resolver all land on the right display.
-
03
The mark renders
Arin picks a colour that stays visible against whatever is underneath and draws above every window.
-
04
It cleans up
Marks expire on TTL, leave with their session, and are invalidated the moment content scrolls away.
Two ways in, three ways to drive
One binary is the daemon, the MCP server, and the command line tool. However you install it and whatever talks to it, that is the same build.
Drive
From an agent
An agent explaining an article can circle each section as it talks about it. A reviewer can point at the exact line it means. Four tools do all of it, named after what the agent is trying to do rather than after the message underneath, so a model reaches for the right one without being told.
point_at
Puts the orb on a position, with an optional caption.
highlight
Frames a region of the screen so it stands out.
annotate
Writes a short explanation next to the thing it explains.
clear
Removes one mark, or every mark the agent drew.
# Claude Code, one line
claude mcp add --scope user arin -- arin mcp
MCP docs →
Install
Homebrew
Compiles where it runs, so nothing is ever quarantined and Gatekeeper never engages.
brew install anistark/tools/arin
Install docs →
Install
Nix
A flake for both Macs, with a nix-darwin module that puts the daemon's options under version control.
nix run github:anistark/arin -- -d
Nix docs →
Drive
From a shell
The same protocol an agent speaks, which makes it the quickest way to see what a
mark actually looks like. It reaches one more than MCP does: draw,
for freehand circles, arrows and underlines.
$ arin point --at top-right --label "the close button"
CLI docs →
Drive
From anything
Newline-delimited JSON over a Unix socket. No client library, and no listening port to find.
{"v":"0.2","type":"point","x":412,"y":88,"label":"Save"}
Protocol docs →
Give your agent some chalk
One brew install away. Needs macOS 14 or newer.