sidehand

Let your AI agent use Windows apps while you keep working: reads and operates desktop controls without stealing your focus, from Windows or WSL. Zero dependencies.

Packages

Package details

extensionskill

Install sidehand from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:sidehand
Package
sidehand
Version
0.5.0
Published
Nov 6, 2026
Downloads
468/mo · 468/wk
Author
blue-b
License
MIT
Types
extension, skill
Size
132.6 KB
Dependencies
0 dependencies · 2 peers
Pi manifest JSON
{
  "skills": [
    "./skills/sidehand"
  ],
  "extensions": [
    "./extensions/sidehand/index.ts"
  ]
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README

Three AI agents fill in three apps hidden behind your note at the same time, while you keep typing in it

Sidehand lets Claude, Codex, Cursor or any MCP client read and operate Windows apps behind the window you are using. It types, clicks, picks from lists and reads the screen as text without moving your mouse or taking your keyboard.

Why Sidehand

  • Stays out of your way. It works in windows behind yours. Nothing comes to the front, and your cursor never moves.
  • Several agents at once. Each agent gets its own session, so three apps can be filled in at the same time.
  • Cheap to read. One short line per control, 4 to 20 times fewer tokens than agent-desktop on the same windows.
  • Small and local. No daemon, no telemetry, no downloaded binary. About 2,400 lines you can read in an afternoon.

Quick start

Add the MCP server to your client. Nothing else to install (Windows 10 or 11, Node 18.3+).

{
  "mcpServers": {
    "sidehand": { "command": "npx", "args": ["-y", "github:Blue-B/sidehand", "mcp"] }
  }
}
Client Where
Claude Desktop Settings › Developer › Edit Config
Claude Code claude mcp add sidehand -- npx -y github:Blue-B/sidehand mcp
Cursor ~/.cursor/mcp.json
Codex ~/.codex/config.toml → [mcp_servers.sidehand] with the same command and args
pi pi install git:github.com/Blue-B/sidehand

Not sure where your client keeps that file? Paste this to your AI agent and it sets itself up:

Install Sidehand (https://github.com/Blue-B/sidehand) for yourself: add an MCP server named "sidehand"
with command "npx" and args ["-y", "github:Blue-B/sidehand", "mcp"] to your own MCP settings.
If you are Claude Code, also run `npm install -g github:Blue-B/sidehand` and add the `sidehand guard`
PreToolUse hook from the README. Then tell me whether I need to restart you.

Prefer a CLI? npm install -g github:Blue-B/sidehand, then tell your agent to use sidehand tree and sidehand act (see Usage).

Keep a stuck agent off your mouse (Claude Code). When an action fails, an agent may write its own script that moves the real mouse or pulls the app forward. With the CLI installed, this hook in .claude/settings.json blocks such Bash commands and tells the agent to ask you instead (pi does this on its own and asks you first):

{
  "hooks": {
    "PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", "command": "sidehand guard" }] }]
  }
}

How it compares

Sidehand Claude computer use ChatGPT computer use Cua Driver agent-desktop
You keep typing while it works ✅ ❌ hides your other windows ❌ takes the pointer and the front window ❌ a console window pops up per call ❌ the app comes to the front
Works on windows that are covered ✅ ❌ ❌ ✅ ✅
Reads apps as text ✅ screenshots screenshots ✅ ✅
Blurs private info in screenshots ✅ ❌ ❌ ❌ ❌
Runs on Windows macOS, Windows macOS, Windows macOS, Windows, Linux macOS, Windows, Linux

Benchmark: Sidehand kept your keyboard (0 s) and finished the task in 2.0 s with 277 tokens

How each number was measured: docs/benchmark.md.

Usage

$ sidehand tree "Contoso Orders"
window: Contoso Orders  (18 elements)
  e4 Edit "Customer"
  e8 ComboBox "Region"
  e12 Button "Submit order"

$ sidehand act e4 type "Blue-B Studio"
$ sidehand act e8 select Jeju
$ sidehand act e12 click
$ sidehand wait "Contoso Orders" "Order submitted"
Command What it does
tree <title> the window's controls as text, each with a ref
act <ref> <action> [value] type, click, check, select, expand, scroll, right-click, double-click, drag, press <keys>
wait <title> <text> wait until a control with that text appears (or --gone)
window <title> <action> move, resize, minimize, restore (behind your windows), close
launch <app> start an app without it taking your focus
capture <mode> screenshot a window even while it is covered; mask blurs private parts
windows, clipboard list windows, read or set the clipboard

MCP and pi expose the same operations as tools (ui_tree, ui_act, capture, ...).

Limit what it can touch: set SIDEHAND_ALLOW="Contoso Orders;Notepad" and every other window disappears from its view.

What works in the background

Win32, WinForms WPF Chrome, Edge VS Code
Type, click, check, select, expand ✅ ✅ ✅ except <select> ✅ click
Right-click, double-click, wheel, hover ✅ ❌ ✅ –
Keys and shortcuts ✅ with consent with consent with consent

WPF ignores mouse messages that do not come from the real mouse, and WPF and browser pages take keys only while focused, so those need --allow-foreground. Games and other apps that draw their own UI expose no controls (capture still works). Apps running as administrator need an elevated agent.

How it works

Sidehand is a UI Automation client, the same interface screen readers use, compiled on your PC on first use. Classic controls get plain window messages (WM_SETTEXT, BM_CLICK, ...), which never activate a window. Everything else gets a UI Automation call while the target window is marked no-activate, so the app cannot pull itself to the front. Clicks and keys are posted to the app's own message queue, never to your mouse.

License

MIT