Notis Desktop Use Skill
Use this skill when a task must operate the user's
real Mac — capture what
is on screen, inspect a native app's UI, click buttons, type, drive menus, or
move windows. The engine is
Peekaboo, a signed,
notarized macOS automation CLI built on a Swift core.
This is
GUI control of the user's own computer. It is not browser
automation and it is not a sandbox. For web pages use
.
For an isolated, reproducible environment use the Vercel Sandbox. Peekaboo
needs the live macOS Aqua session, the screen, and TCC permissions, so it only
runs on the user's
.
Step 0 — Switch to the LOCAL shell FIRST (mandatory)
Peekaboo controls the user's physical Mac, so every command must run on the
local shell (the Notis desktop bridge), never the Vercel sandbox. Shell
calls default to
— if you skip this step your
command runs in
, where Peekaboo does not exist and cannot
touch the Mac.
Before any command, call with
.
- If it succeeds, all subsequent shell calls run on the user's Mac. Proceed.
- Your Computer is available on every plan, including Free. If this call
unexpectedly returns
entitlement_upgrade_required
, report the access-policy
mismatch and stop; do not turn it into Ultra upgrade guidance. If it returns
entitlement_check_unavailable
, ask the user to retry.
- If it returns an error that the Notis desktop app is not connected, tell the
user to open the Notis desktop app and turn on Your Computer (computer
use) in settings, then stop. Do not run in the sandbox and do
not fall back to the browser tools to fake desktop control.
Never
or assume a sandbox working directory — run
directly on the local shell.
Peekaboo is already installed — do not install it
The Notis desktop app installs and manages a pinned Peekaboo for you (it's on
your
) the moment the user enables computer use. So:
- Do not run , download releases, or check .
- Just run directly once you are on the local shell.
If
fails on the local shell, Peekaboo has not finished
installing — tell the user to toggle
Your Computer off and back on in the
Notis desktop settings (which triggers the install), then retry. Do not try to
install it yourself.
One plain command per call — no chaining
Run a
single invocation per shell call. Do
not combine it
with
,
,
, pipes (
), redirects, or
. Plain
commands auto-run on the local shell without an approval prompt; chained or
piped commands lose that and get blocked or prompt the user. Parse output in a
later step with
instead of piping inline.
bash
# Good — runs immediately:
peekaboo --version
peekaboo see --json
# Bad — chained/piped, will be blocked or prompt:
~/bin/peekaboo --version || peekaboo --version
peekaboo app list --json | python3 -c '...'
Permissions Are Mandatory — Check Before Acting
Peekaboo cannot capture or automate without macOS TCC grants. Always check
permissions first and surface missing grants to the user; you cannot grant
them programmatically.
bash
peekaboo permissions status --json
peekaboo permissions status --all-sources # compare Bridge host vs local CLI
What each capability needs (System Settings → Privacy & Security):
- Screen Recording → required for , , and any capture. Enable
the terminal/IDE/process that runs . After a Homebrew upgrade,
re-check that the enabled entry points at the current binary path.
- Accessibility → required for clicks, typing, key presses, and window
control. Enable the same terminals/IDEs.
- Event Synthesizing →
peekaboo permissions request-event-synthesizing
(add to request it for the local CLI process). Enables
process-targeted typing/hotkeys/paste without stealing focus.
If a needed grant is missing, tell the user exactly which toggle to flip and
re-run
peekaboo permissions status --json
before continuing. Do not loop on
failed captures.
Remote / Background Sessions
On SSH, LaunchAgent, cron, or other background launchd sessions, prefer the
Peekaboo
Bridge path even when TCC appears granted — CoreGraphics can
report success while returning only the desktop wallpaper or a redacted image.
On remote Macs, Screen Recording may be blocked while clicks and typing still
work through Accessibility; when the target UI is otherwise knowable, continue
with clicks /
instead of giving up.
Start Here — Load The Live Tool Surface
Peekaboo's CLI is the source of truth for its own command surface; load it
instead of guessing syntax (it matches the installed version):
bash
peekaboo learn # full agent guide: system prompt, tool catalog, signatures
peekaboo tools # MCP/agent tool catalog (supports --verbose, --json)
peekaboo <command> --help
Most commands support
(alias
) for machine parsing —
prefer it when you need to act on the result. They share a snapshot cache,
so capture once and reuse snapshot IDs.
Core Loop: See → Act → Re-see
bash
# 1. Capture an annotated UI map with element IDs (and a snapshot ID).
peekaboo see --json
# 2. Act on a target by element ID, query, or coordinates.
peekaboo click "Save" # by query/label
peekaboo type "hello world" # send text
peekaboo hotkey cmd,s # modifier combo in one shot
# 3. Re-capture before the next decision — IDs are per-snapshot and the screen
# changes after every action.
peekaboo see --json
Re-
after navigation, dialogs, app switches, or any dynamic re-render.
Treat stale element IDs as invalid.
Clicking by coordinates needs
A bare
(no target) is
rejected:
Background click requires --app/--pid/--window-id or a snapshot; use --foreground
. So when you click a raw coordinate, focus the window first and
pass
:
bash
peekaboo window focus --app "Dia" --window-id 118166
peekaboo click --coords 672,607 --foreground
Prefer clicking by element ID/query when
/
give you one. Use
coordinates only when they don't (see next section).
Browser / web apps (Dia, Chrome, Safari, …): screenshot, don't inspect
Browsers usually expose
no accessibility tree for their web content, so
and
fail (
App '<X>' is running but has no windows or dialogs
, or return 0 elements) even though the page is visible.
Do not loop
on / for web pages — switch to vision:
- Capture the window:
peekaboo image --app "Dia" --window-id <id> --mode window --path /tmp/shot.png --json
(get from peekaboo list windows --app "Dia" --json
).
- Locate the control visually in that screenshot.
- Convert to a screen coordinate: window-capture pixels map to global display
points offset by the window's top-left origin (from the capture's /
). E.g. a window at origin → image pixel
is screen point .
- Focus the window and
click --coords X,Y --foreground
(above), then
re- to confirm the result changed.
Keyboard shortcuts like
do
not reliably control web players (in a
browser, space scrolls the page) — click the actual on-screen play/pause
control instead.
Command Map
Run
/
peekaboo <command> --help
for authoritative flags.
- Vision & capture: (annotated UI map + snapshot IDs, optional AI
analysis), (raw PNG/JPG of screen/window/menubar, ),
(live/long-running),
list apps|windows|screens|menubar|permissions
.
- Interaction: , (, ), , ,
(atomic clipboard set → Cmd+V → restore), , , ,
.
- Windows / menus / apps / spaces: (close/minimize/maximize/move/
resize/focus/list), (list/switch/move-window), , ,
(launch/quit/relaunch/hide/switch/list, ), ,
, (click/input/file/dismiss/list).
- Automation & integration: (natural-language automation with
dry-run planning + resume), (accessibility-tree inspection with
no screenshot), ( scripts), , , ,
, .
For structured multi-step flows, orchestrate commands inside a
script run via
peekaboo run --output ...
, rather than
chaining many shell calls.
Safety Rules
- Never click, type, or destructively automate unless the user explicitly
asked for that action or the target is a controlled test surface. Capturing
and inspecting are read-only and safe; sending input is not.
- Treat the screen as private. Do not exfiltrate screenshots or on-screen
content beyond what the task requires, and do not capture and forward
unrelated windows.
- Avoid actions that trigger irreversible system dialogs (delete confirmations,
purchases, sends) without explicit user confirmation. When in doubt, capture
the dialog with and ask before clicking.
- Prefer when testing local TCC behavior; use the Bridge path for
background/remote captures.
Anti-Patterns
- Do not run before calling with . The
default runs it in , where Peekaboo does not
exist — the command "fails" and looks like a permissions problem when it
isn't.
- Do not (or any sandbox path) and do not assume a sandbox
working directory. Run directly on the local shell.
- Do not install Peekaboo (no , no downloads, no probes).
The Notis desktop app already installed and manages it on your .
- Do not chain with , , , pipes, redirects, or . One
plain command per call so it auto-runs without prompting.
- Do not bare-coordinate-click () — it's rejected. Focus the
window and use
click --coords X,Y --foreground
.
- Do not loop on / for a browser's web page (Dia, Chrome,
Safari). They have no web accessibility tree — screenshot with and
target coordinates visually instead.
- Do not rely on /keyboard to play a web video — click the on-screen
play control.
- Do not skip the permissions check. A missing grant returns wallpaper-only or
empty captures, not an obvious error.
- Do not reuse element IDs across snapshots, or act without a fresh .
- Do not guess command syntax from memory — load /
for the installed version.
- Do not send input to the user's machine on your own initiative. Read-only
capture is the default; mutation needs an explicit request.