Skip to content
Back to skills

Atmos Desktop Use

ASecurity

Capture and control the local macOS desktop via `atmos desktop-use` (screenshot, click, type, window list) without MCP. Use whenever the user or task needs local screen capture, UI automation, AppShot-style screenshots, verifying on-screen UI, desktop click/type, or checking Desktop Use install/permissions — even if they say "screenshot the app", "click the button on screen", "drive the UI", or "computer use" on this machine. Do not use for remote machines (Atmos Computer / Relay), Device Pre...

  • 6 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 29, 2026
developmentgoswiftshellbashnodegitbackend

Works with

  • cursor
  • terminal
  • cli
  • mcp

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 29, 2026

npx -y skills add AruNi-01/atmos --skill atmos-desktop-use --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Atmos Desktop Use?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Atmos Desktop Use
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aruni-01-atmos-desktop-use/badge)](https://www.skillsdirectory.com/skills/aruni-01-atmos-desktop-use)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: atmos-desktop-use
version: "1.6.2"
description: >
  Capture and control the local macOS desktop via `atmos desktop-use` (screenshot,
  click, type, window list) without MCP. Use whenever the user or task needs local
  screen capture, UI automation, AppShot-style screenshots, verifying on-screen UI,
  desktop click/type, or checking Desktop Use install/permissions — even if they say
  "screenshot the app", "click the button on screen", "drive the UI", or "computer use"
  on this machine. Do not use for remote machines (Atmos Computer / Relay), Device
  Preview phone (atmos-device-preview), or for in-repo file/git/terminal work.
---

# Atmos Desktop Use

Local desktop capture + control via `atmos desktop-use`. **No MCP.** Brand: **Desktop Use** / **Atmos Desktop Use** only.

Not this skill: Device Preview phone → `atmos-device-preview`.

Details: [`references/cli.md`](references/cli.md).

## Prerequisites

1. `atmos` on `PATH`.
2. Engine installed + **Accessibility** + **Screen Recording** for **Atmos Desktop Use** (Settings → Desktop Use). Agents cannot complete TCC.

## Decision tree

| Intent | Commands |
|--------|----------|
| Ready? | `status` + `doctor` |
| List windows | `drive verify` (**not** `drive windows`) |
| Full-display screenshot | `drive screenshot --out …` (preferred for click loops) |
| Frontmost window only | `capture --out …` |
| Click / type / full desktop shell | `drive click|type|double-click|scroll|hotkey|…` (Phase 1–2; see cli.md) |
| **Page / Chrome DOM** | **`atmos browser-use`** (separate product — not Desktop Use) |
| Install engine | `driver ensure` |

## Critical click rules (read this — most failures are here)

### 1) Coordinate space (Retina trap)

`drive screenshot` returns a **native PNG** that is often **2×** logical screen size (e.g. screen 1512×982, PNG 3024×1964).

| Source of (x, y) | Flag | Example |
|------------------|------|---------|
| Pixel you read on the **drive screenshot PNG** | default `--coord-space png` | button at image (200, 322) → `--x 200 --y 322` |
| `drive verify` bounds / AX `position` / System Events | `--coord-space points` | AX says (100, 161) → `--x 100 --y 161 --coord-space points` |

**Wrong:** treating logical points (bounds/AX) as default PNG coords → click lands at ~half offset (looks like hover / miss).

### 2) Do not mix addressing modes

| Mode | How | Background? |
|------|-----|-------------|
| **AX element_token** (**preferred**) | `window-state` → `click --element-token` | **Yes** — even hidden / off-Space when tree exists |
| **Desktop PNG** | `--x --y` only, **no** `--pid` | Needs window **on-screen** |
| **Window-local** | `--window-id` + optional `--pid`, coords from **that** window image | Same |

```bash
# BEST — AX token (true background) when window-state has elements
atmos desktop-use --json drive window-state --pid <pid> --window-id <id>
# read result.atmos_surface + elements[].element_token, then:
atmos desktop-use --json drive click --element-token '<token>' --pid <pid> --window-id <id>
atmos desktop-use --json drive type --text "…" --element-token '<token>' --pid <pid> --window-id <id>

# GOOD — PNG pixels from drive screenshot (no --pid)
atmos desktop-use --json drive screenshot --out /tmp/du.png
atmos desktop-use --json drive click --x <png_x> --y <png_y>

# GOOD — logical points from window bounds / AX
atmos desktop-use --json drive click --x 100 --y 161 --coord-space points

# Electron stubborn UI (last resort — brief focus steal):
atmos desktop-use --json drive click --x <png_x> --y <png_y> \
  --delivery-mode foreground --window-id <id>

# BAD
atmos desktop-use --json drive click --x 100 --y 161 --pid 12345   # bare pid + screen coords
# BAD — logical y=161 without --coord-space points on Retina → lands ~y=80
# BAD — thrashing element_token when atmos_surface.kind is ax_empty
```

### 3) Electron / Chromium shells (Slack, VS Code, Discord, Orca, …)

These are **Desktop Use**, not Browser Use. OS AX is often empty or shell-only.

**Always start with window-state** and read `result.atmos_surface`:

| `atmos_surface.kind` | Meaning | Do this |
|----------------------|---------|---------|
| `ax_ok` | Actionable tree | **Only** `element_token` until it fails |
| `ax_sparse` | Few nodes (chrome) | Token if matches; else pixel for content |
| `ax_heavy` | Huge tree | `--max-elements` / `--max-depth` / `--query`; still prefer token |
| `ax_empty` | Empty / `ax_window_unresolved` | **Stop AX retries** → screenshot + pixel ladder |

```bash
atmos desktop-use --json drive window-state --pid <pid> --window-id <id>
# optional bounds for heavy apps:
atmos desktop-use --json drive window-state --pid <pid> --window-id <id> \
  --max-elements 400 --max-depth 15 --query "Send"

# ax_empty / electron_likely:true → pixel path only
atmos desktop-use --json drive screenshot --out /tmp/du.png
atmos desktop-use --json drive click --x <png_x> --y <png_y>          # background first
# only if UI unchanged:
atmos desktop-use --json drive click --x <png_x> --y <png_y> \
  --delivery-mode foreground --window-id <id>
```

**Action ladder (hard rule):**  
`background AX token` → re-snapshot → `background pixel` → re-screenshot → `foreground + window_id`.  
Do **not** use `atmos browser-use` for Slack/VS Code/Discord (no CDP for ordinary Electron shells).

### 4) After every click

Take a new screenshot and confirm the UI changed. If not: drop bare `--pid`, fix coord space, check `is_on_screen`, advance one step on the ladder.

## Default loop

```bash
atmos desktop-use --json status
atmos desktop-use --json doctor
atmos desktop-use --json drive verify
atmos desktop-use --json drive screenshot --out "$HOME/.atmos/desktop-use/shots/before.png"

# Plan (x,y) from the PNG pixels (see screenshot JSON: screenshot_width vs screen_width)
atmos desktop-use --json drive click --x <png_x> --y <png_y>
atmos desktop-use --json drive screenshot --out "$HOME/.atmos/desktop-use/shots/after.png"
```

## Background control (you can keep working in another app)

**Default is background** — `delivery_mode=background`. The engine does **not** need the target app to stay frontmost.

| Path | Background? | Notes |
|------|-------------|-------|
| **AX `element_token`** (preferred) | **Yes** — backgrounded / minimized / off-Space when tree exists | `window-state` → `click/type --element-token` |
| **Pixel click** (`--x --y`) | **Partial** — window must be **on-screen** | Pixel clicks annotate `atmos_addressing`. Use `foreground` only after background fails |
| `bring_to_front` | **Never default** | Explicit `drive front` only |

```bash
# True background (AX ok):
atmos desktop-use --json drive window-state --pid <pid> --window-id <id>
# use atmos_surface.sample_element_token or elements[].element_token
atmos desktop-use --json drive click --element-token '<token>' --pid <pid> --window-id <id>

# Pixel path (ax_empty / Electron) — window on-screen, background first:
atmos desktop-use --json drive click --x <png_x> --y <png_y>
atmos desktop-use --json drive click --x <png_x> --y <png_y> \
  --delivery-mode foreground --window-id <id>
```

## Visibility chrome

| Expectation | Reality |
|-------------|---------|
| See where agent points | Session + `move_cursor`; idle hide extended to ~1h for drive session |
| App / desktop **border highlight** | **Yes, blinking** — blue window / green desktop. Auto-clears after idle (~8s) or `drive session-end`. Toggle in Settings → Desktop Use → Operation border |
| **Under-arrow status text** | **`{Agent} - {operation}`** under the pointer only. Explicit: `--status "…"`. Auto: `Clicking Orca` / `Operating`. No free-floating capsule without a cursor position. |
| **Border z-order** | Window border sits just above the target; **hides** when another app covers the target (does not paint over your work). No full-desktop fallback for window-scoped actions. |
| Must activate target app | **No** for default background path — avoid `drive front` every turn |

```bash
# End a drive run (clears border + engine session cursor)
atmos desktop-use --json drive session-end

# Prefs
atmos desktop-use --json prefs get
atmos desktop-use --json prefs set --operation-border false
```

```bash
# Agent should pass its own identity + live status when known:
export ATMOS_DESKTOP_USE_AGENT_NAME="Claude"
atmos desktop-use --json drive click --x … --y … --agent-name "Claude" --status "Opening 智能体仪表盘"
# Caption: "Claude - Opening 智能体仪表盘" (under pointer only)
# Auto without --status: "Claude - Clicking Orca" when window_id resolves

# Empty-AX type (QQ Music / custom UI): pixel-focus then type at same coords
atmos desktop-use --json drive click --x <png_x> --y <png_y>
atmos desktop-use --json drive type --text "周杰伦" --x <png_x> --y <png_y>
# logical screen points + window (auto-normalized to window-local PNG):
atmos desktop-use --json drive type --text "周杰伦" --x 780 --y 78 \
  --coord-space points --window-id <id> --pid <pid>
```

## Desktop vs page CDP

| Target | Command family |
|--------|----------------|
| Any app shell, keys, AX, pixels | **`atmos desktop-use drive …`** (this skill) |
| Chrome/Chromium **page** DOM | **`atmos browser-use …`** (separate skill surface; **no MCP**) |
| Atmos in-app browser (webview) | `atmos browser-use --backend embedded` |

Do **not** use Desktop Use for deep webpage automation when Browser Use is available.

## Anti-patterns

- `drive windows` — use `drive verify`
- `click --pid` + screen/PNG coordinates (no `window_id`)
- Logical points without `--coord-space points` on Retina
- `osascript activate` every turn (use `delivery_mode foreground` only when needed)
- Endless coordinate spam without after-screenshot
- Raw AppleScript/Swift before fixing coord space / bare pid
- MCP for desktop or browser control

## Errors

| Signal | Recovery |
|--------|----------|
| `control_engine_not_installed` | `driver ensure` / Settings Install |
| TCC denied | User grants Atmos Desktop Use AX + Screen Recording |
| ok click, no UI change | Drop `--pid`; fix png vs points; on-screen; `foreground` + `window_id` |
| empty PNG | doctor + permissions |

## Reporting

- Commands + ok/error  
- Screenshot paths before/after  
- Coord space used (`png` vs `points`) and whether `--pid` / `window_id` / `foreground`  

Files in this skill

  • SKILL.md10.2 KB
  • references/cli.md7.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.