Catalog PyPI
PACKAGE EXPLORERView in registry

acuser

PyPI

A lightweight macOS control CLI for agents

Versions collected1
Direct dependencies4From release 0.1.1
Last observed20 Oct, 18:43 UTC

README

Version 0.1.1 documentation

acuser

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.

Install

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.

Install for development

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.

Agent guidance

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.

  1. Check access with acuser permissions.
  2. Establish context with acuser acclimate or query apps and windows.
  3. Focus the target application.
  4. Prefer Accessibility inspection and semantic clicks.
  5. Use coordinates only after resolving current window bounds.
  6. Use a screenshot when the UI is visual or Accessibility data is insufficient.
  7. Verify important actions with a fresh query or screenshot.

Never reuse stale coordinates after an app switch, scroll, window move, display change, or layout change.

Observation commands

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.

Control commands

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.

Permissions

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

Safety model

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.

Development checks

python -m py_compile acuser.py
acuser --help
acuser agent-help --format json

Downloads & popularity

3downloads
1-day window · source-reported counts20 Oct 2026
8140.50
2026-08-07: 81 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-07–2026-08-072026-08-08: 67 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-08–2026-08-082026-08-09: 7 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-09–2026-08-092026-08-10: 5 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-10–2026-08-102026-08-11: 9 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-11–2026-08-112026-08-13: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-13–2026-08-132026-08-14: 4 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-14–2026-08-142026-08-15: 9 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-15–2026-08-152026-08-16: 4 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-16–2026-08-162026-08-17: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-17–2026-08-172026-08-18: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-18–2026-08-182026-08-20: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-20–2026-08-202026-08-23: 4 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-23–2026-08-232026-08-24: 8 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-24–2026-08-242026-08-25: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-25–2026-08-252026-08-28: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-28–2026-08-282026-08-29: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-29–2026-08-292026-08-31: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-08-31–2026-08-312026-09-01: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-01–2026-09-012026-09-03: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-03–2026-09-032026-09-04: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-04–2026-09-042026-09-07: 7 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-07–2026-09-072026-09-09: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-09–2026-09-092026-09-10: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-10–2026-09-102026-09-11: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-11–2026-09-112026-09-12: 4 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-12–2026-09-122026-09-14: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-14–2026-09-142026-09-16: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-16–2026-09-162026-09-17: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-17–2026-09-172026-09-18: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-18–2026-09-182026-09-19: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-19–2026-09-192026-09-21: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-21–2026-09-212026-09-24: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-24–2026-09-242026-09-25: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-25–2026-09-252026-09-26: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-26–2026-09-262026-09-27: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-27–2026-09-272026-09-28: 4 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-28–2026-09-282026-09-29: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-29–2026-09-292026-09-30: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-09-30–2026-09-302026-10-05: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-05–2026-10-052026-10-06: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-06–2026-10-062026-10-07: 2 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-07–2026-10-072026-10-08: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-08–2026-10-082026-10-09: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-09–2026-10-092026-10-10: 4 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-10–2026-10-102026-10-11: 1 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-11–2026-10-112026-10-12: 6 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-12–2026-10-122026-10-13: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-13–2026-10-132026-10-20: 3 · observed 2026-10-21T13:53:00.1193622Z · period 2026-10-20–2026-10-20
7 Aug20 Oct

pypistats · 49 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-20 – 2026-10-2032026-10-21T13:53:00.1193622Z
2026-10-13 – 2026-10-1332026-10-21T13:53:00.1193622Z
2026-10-12 – 2026-10-1262026-10-21T13:53:00.1193622Z
2026-10-11 – 2026-10-1112026-10-21T13:53:00.1193622Z
2026-10-10 – 2026-10-1042026-10-21T13:53:00.1193622Z
2026-10-09 – 2026-10-0912026-10-21T13:53:00.1193622Z
2026-10-08 – 2026-10-0812026-10-21T13:53:00.1193622Z
2026-10-07 – 2026-10-0722026-10-21T13:53:00.1193622Z
2026-10-06 – 2026-10-0612026-10-21T13:53:00.1193622Z
2026-10-05 – 2026-10-0522026-10-21T13:53:00.1193622Z
2026-09-30 – 2026-09-3012026-10-21T13:53:00.1193622Z
2026-09-29 – 2026-09-2922026-10-21T13:53:00.1193622Z
2026-09-28 – 2026-09-2842026-10-21T13:53:00.1193622Z
2026-09-27 – 2026-09-2712026-10-21T13:53:00.1193622Z
2026-09-26 – 2026-09-2612026-10-21T13:53:00.1193622Z
2026-09-25 – 2026-09-2512026-10-21T13:53:00.1193622Z
2026-09-24 – 2026-09-2412026-10-21T13:53:00.1193622Z
2026-09-21 – 2026-09-2122026-10-21T13:53:00.1193622Z
2026-09-19 – 2026-09-1932026-10-21T13:53:00.1193622Z
2026-09-18 – 2026-09-1832026-10-21T13:53:00.1193622Z
2026-09-17 – 2026-09-1712026-10-21T13:53:00.1193622Z
2026-09-16 – 2026-09-1632026-10-21T13:53:00.1193622Z
2026-09-14 – 2026-09-1422026-10-21T13:53:00.1193622Z
2026-09-12 – 2026-09-1242026-10-21T13:53:00.1193622Z
2026-09-11 – 2026-09-1122026-10-21T13:53:00.1193622Z
2026-09-10 – 2026-09-1012026-10-21T13:53:00.1193622Z
2026-09-09 – 2026-09-0922026-10-21T13:53:00.1193622Z
2026-09-07 – 2026-09-0772026-10-21T13:53:00.1193622Z
2026-09-04 – 2026-09-0432026-10-21T13:53:00.1193622Z
2026-09-03 – 2026-09-0322026-10-21T13:53:00.1193622Z
2026-09-01 – 2026-09-0112026-10-21T13:53:00.1193622Z
2026-08-31 – 2026-08-3122026-10-21T13:53:00.1193622Z
2026-08-29 – 2026-08-2932026-10-21T13:53:00.1193622Z
2026-08-28 – 2026-08-2832026-10-21T13:53:00.1193622Z
2026-08-25 – 2026-08-2512026-10-21T13:53:00.1193622Z
2026-08-24 – 2026-08-2482026-10-21T13:53:00.1193622Z
2026-08-23 – 2026-08-2342026-10-21T13:53:00.1193622Z
2026-08-20 – 2026-08-2012026-10-21T13:53:00.1193622Z
2026-08-18 – 2026-08-1832026-10-21T13:53:00.1193622Z
2026-08-17 – 2026-08-1712026-10-21T13:53:00.1193622Z
2026-08-16 – 2026-08-1642026-10-21T13:53:00.1193622Z
2026-08-15 – 2026-08-1592026-10-21T13:53:00.1193622Z
2026-08-14 – 2026-08-1442026-10-21T13:53:00.1193622Z
2026-08-13 – 2026-08-1322026-10-21T13:53:00.1193622Z
2026-08-11 – 2026-08-1192026-10-21T13:53:00.1193622Z
2026-08-10 – 2026-08-1052026-10-21T13:53:00.1193622Z
2026-08-09 – 2026-08-0972026-10-21T13:53:00.1193622Z
2026-08-08 – 2026-08-08672026-10-21T13:53:00.1193622Z
2026-08-07 – 2026-08-07812026-10-21T13:53:00.1193622Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.18 Aug 20264

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 18:43 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:2a199e508d51d06462337628da19b884d7e4c256d77a8a4dfb84265d62da6cd4