Observed since 20 Oct, 18:43 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A lightweight macOS control CLI for agents
Give any terminal agent—or any agent with access to subprocess—full control of
a macOS computer through a small, agent-friendly CLI.
acuser is a local macOS observation and control CLI for AI agents. It combines
structured macOS APIs with mouse/keyboard control and screenshots as a visual
fallback.
For a normal user installation, use pipx:
pipx install acuser
acuser permissions
If you already manage your own Python environment, regular pip also works:
python3 -m pip install acuser
acuser supports macOS with Python 3.10 or newer. macOS may ask for
Accessibility and Screen Recording permissions the first time a command needs
them; those permissions normally persist after approval.
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e .
The package currently targets macOS and requires Python 3.10 or newer.
The built-in agent guide is the canonical usage reference:
acuser agent-help
acuser agent-help --format json
The Markdown guide explains the observe → act → verify loop. The JSON form uses
schema acuser.agent-command-catalog.v1 and is intended for wrappers, skills,
and other agents that need to discover commands without parsing terminal prose.
acuser permissions.acuser acclimate or query apps and windows.Never reuse stale coordinates after an app switch, scroll, window move, display change, or layout change.
acuser apps # app metadata, PIDs, bundle IDs, state
acuser apps --names # names only
acuser windows # window IDs, owners, titles, bounds
acuser inspect Safari --depth 3 # Accessibility tree
acuser dock # Dock geometry and ordered items
acuser permissions # macOS permission status
acuser acclimate --output /tmp/state.json
acuser state --input /tmp/state.json
acuser screenshot WINDOW_ID /tmp/window.png
# If vision identifies (1840, 1350) in that PNG:
acuser click --screenshot /tmp/window.png 1840 1350
All successful commands emit JSON except agent-help in its default Markdown
mode. Coordinates are global macOS logical screen points. Screenshot pixels may
be higher density and must be scaled before using them as click coordinates. The
screenshot command writes a .png.json sidecar containing the captured
window bounds, pixel dimensions, scale, and timestamp. Passing that PNG to
click --screenshot performs the conversion and refuses to click if the target
window has moved or resized since capture.
acuser launch Arc
acuser focus Arc
acuser move 500 300
acuser click 500 300
acuser click --app Notes --title "New Note"
acuser type 'hello from an agent'
acuser press enter
acuser hotkey command l
acuser hotkey command+shift 4
acuser scroll -6
acuser scroll 3 --horizontal 2
acuser drag 400 300 900 600 --duration 0.8
click --app ... --title ... uses the macOS Accessibility API and is generally
more stable than coordinate clicking. type uses paste-and-restore by default;
--method events is a fallback for controls that reject paste. drag emits
interpolated left-button drag events for gesture-sensitive controls.
The process needs macOS Accessibility permission for cross-application inspection and control. Screen Recording permission may be required for window capture. These are granted in System Settings → Privacy & Security and normally persist after the first approval.
acuser permissions
acuser permissions --prompt
Observation commands are read-only, except that acclimate writes a local state
file and screenshot writes an image. Input commands can affect the active
application and may submit forms, edit documents, send messages, or trigger
external actions. Agents should identify the target, act deliberately, and
verify the result. Do not expose passwords, tokens, or sensitive data in
screenshots or typed command arguments.
python -m py_compile acuser.py
acuser --help
acuser agent-help --format json
pypistats · 49 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-20 – 2026-10-20 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-13 – 2026-10-13 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-12 – 2026-10-12 | 6 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-11 – 2026-10-11 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-10 – 2026-10-10 | 4 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-09 – 2026-10-09 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-08 – 2026-10-08 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-07 – 2026-10-07 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-06 – 2026-10-06 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-10-05 – 2026-10-05 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-30 – 2026-09-30 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-29 – 2026-09-29 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-28 – 2026-09-28 | 4 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-27 – 2026-09-27 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-26 – 2026-09-26 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-25 – 2026-09-25 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-24 – 2026-09-24 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-21 – 2026-09-21 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-19 – 2026-09-19 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-18 – 2026-09-18 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-17 – 2026-09-17 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-16 – 2026-09-16 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-14 – 2026-09-14 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-12 – 2026-09-12 | 4 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-11 – 2026-09-11 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-10 – 2026-09-10 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-09 – 2026-09-09 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-07 – 2026-09-07 | 7 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-04 – 2026-09-04 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-03 – 2026-09-03 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-09-01 – 2026-09-01 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-31 – 2026-08-31 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-29 – 2026-08-29 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-28 – 2026-08-28 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-25 – 2026-08-25 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-24 – 2026-08-24 | 8 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-23 – 2026-08-23 | 4 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-20 – 2026-08-20 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-18 – 2026-08-18 | 3 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-17 – 2026-08-17 | 1 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-16 – 2026-08-16 | 4 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-15 – 2026-08-15 | 9 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-14 – 2026-08-14 | 4 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-13 – 2026-08-13 | 2 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-11 – 2026-08-11 | 9 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-10 – 2026-08-10 | 5 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-09 – 2026-08-09 | 7 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-08 – 2026-08-08 | 67 | 2026-10-21T13:53:00.1193622Z |
| 2026-08-07 – 2026-08-07 | 81 | 2026-10-21T13:53:00.1193622Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.1 | 8 Aug 2026 | 4 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 18:43 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:2a199e508d51d06462337628da19b884d7e4c256d77a8a4dfb84265d62da6cd4