Robo

A single-binary command-line tool that types keys, drives the clipboard, switches browsers, and moves windows. The engine inside Mac-A-Tron’s Stream Deck plug-in — shipped as a standalone CLI so the same primitives are reachable from shell scripts, aliases, BetterTouchTool, Raycast, and anything else that can spawn a process.
macOS 13+ · Windows 10+ · same wire-line transforms

Intent

robo is the layer underneath Mac-A-Tron. It does one thing per invocation: type a key chain, read or write the clipboard, switch a browser tab, move a window, change a setting. Every Stream Deck action in Mac-A-Tron eventually fires a robo command; exposing that surface directly means the same primitives work from a Terminal alias, a shell script, BetterTouchTool, or anything else that can run a process.

macOS and Windows ship as separate native binaries (Swift on macOS, .NET 8 on Windows), but the same command set and the same {curly-token} buffer transforms are wire-line compatible across both — a chain like {cmd+c}{grab}{trim after ?}{paste} behaves identically.

Same engine, two front-ends. On macOS, robo is the engine underneath Mac-A-Tron’s Stream Deck buttons. On Windows, the equivalent Stream Deck plug-in is WinTronic — separate name because the two plug-ins don’t offer quite the same action set (some macOS-only flows have no Windows analogue, and a few Windows-only conveniences exist that don’t apply on the Mac side). Either way, the underlying robo CLI is the shared substrate, and anywhere the docs mention “buffer commands” or “curly tokens,” they’re describing robo features that you can also reach from the shell.

Install

From the Mac-A-Tron Stream Deck plug-in

If you have the Mac-A-Tron plug-in installed, robo already lives at:

~/Library/Application Support/com.elgato.StreamDeck/Plugins/com.robomac.multiauto.sdPlugin/bin/macos/robo

To make robo available on your $PATH from anywhere, copy it into /usr/local/bin:

sudo cp ~/Library/Application\ Support/com.elgato.StreamDeck/Plugins/com.robomac.multiauto.sdPlugin/bin/macos/robo /usr/local/bin/

This is a copy, not a symlink — re-run the same command after a plug-in update to pick up the new binary.

Permissions

On macOS, key-typing and window movement require Accessibility permission:

  • System Settings → Privacy & Security → Accessibility
  • Add the terminal you’re invoking robo from (Terminal.app, iTerm2, etc.), or the Stream Deck plug-in process

robo healthcheck prints whether the current process can read window positions and post mouse events — use it to diagnose permission issues.

robo keys

Type strings into whichever app currently has keyboard focus. Plain text is typed as-is; {curly braces} hold special keys, modifier chords, pauses, clipboard ops, and buffer transforms.

robo keys "Hello World{enter}"
robo keys "{cmd+c}{pause 100}{cmd+v}"
robo keys "Test {leftbrace}curly{rightbrace} braces"
robo keys "ls{enter}{pause 500}cd ..{enter}"

Clipboard / buffer operations (in keys chains)

TokenWhat it does
{grab}Copy the system clipboard into robo’s internal buffer.
{put}Push robo’s buffer back onto the system clipboard.
{paste}Type the buffer contents at the cursor.
{insert before <text>}Prepend text to the buffer.
{insert after <text>}Append text to the buffer.
{trim before <text>}Remove everything up to and including <text>.
{trim after <text>}Remove from <text> to the end.
{pause <ms>}Wait the given number of milliseconds (e.g. {pause 100}).

Modifier names (cmd, ctrl, alt, shift) and key names (enter, tab, space, function keys, arrows, etc.) live in robo help. The cmd modifier is aliased to Ctrl on Windows, so {cmd+c} copies on both platforms.

Real-world chain. Copy selected text, grab it into the buffer, strip the query string, prepend an archive prefix, and paste the result:
robo keys "{cmd+c}{grab}{trim after ?}{insert before http:{slash}{slash}archive.is{slash}}{paste}"

robo paste · robo copy

Cross-platform pbpaste / pbcopy equivalents — useful from scripts that want the system clipboard without spawning a window.

# Print the clipboard's text contents to stdout (no trailing newline).
robo paste

# Read stdin and replace the clipboard.
echo "now on the clipboard" | robo copy
cat ~/notes.txt | robo copy

On Windows the same commands exist, so a shell script using robo copy / robo paste works on both platforms without feature-detecting the OS.

robo browser-tab

Switch to an open browser tab by URL/title pattern, or open a new one if no match is found. Treats tabs as launchable apps.

robo browser-tab "Google Chrome" "mail.google.com" "Inbox" "https://mail.google.com"
robo browser-tab "Safari"        "slack.com"       "Slack || #general" "https://app.slack.com"

Title patterns can be combined with || for OR matching. The URL is used only when no existing tab matches — robo focuses an existing tab when possible to avoid spawning duplicates.

robo browser-default

List, query, or toggle the system default browser.

robo browser-default list                # JSON list of installed browsers
robo browser-default current             # show the current default
robo browser-default set 2               # set by index from `list`
robo browser-default set --bundle com.google.Chrome
robo browser-default toggle --a com.apple.Safari --b com.google.Chrome

On Windows, set opens ms-settings:defaultapps rather than silently rewriting the registry — system policy doesn’t allow the silent path.

robo move-mouse

Move the pointer to a known anchor — the front-most app window, or a numbered screen.

robo move-mouse                       # default: center of current screen
robo move-mouse app center            # center of the focused app's window
robo move-mouse app home              # upper-left of the focused app's window
robo move-mouse screen 2 center       # center of monitor 2
robo move-mouse screen 1 home         # upper-left of monitor 1

Used by the Stream Deck plug-in’s Move Mouse action. Cheap building block for “wake this monitor / focus this side” flows.

robo move-app

Move and resize the focused window. Cycles through positions on repeated invocations and remembers per-app state.

robo move-app left      # left half (then left third, then left two-thirds, on repeat)
robo move-app right
robo move-app up
robo move-app down

The cycle state lives in ~/Library/Application Support/com.robomac.robo/store.json on macOS (and the equivalent %APPDATA% path on Windows), so closing and re-opening the app picks up where it left off.

robo settings

Read and write robo’s on-disk settings store.

robo settings                          # list all settings as JSON
robo settings cycle.steps              # show one value
robo settings cycle.steps "1/2,1/3,2/3"   # set a value
robo settings --remove cycle.steps     # delete a key

The settings file is the same one the Stream Deck plug-in writes when you change action options in the Property Inspector — editing from the CLI is occasionally faster when bulk-setting many keys.

robo healthcheck

Verify that robo has the OS permissions it needs and the basic event-capture / event-post path works.

robo healthcheck

Reports whether the running process can read window positions, post mouse events, and post keystrokes. The Stream Deck plug-in calls this when diagnostics are requested.

If healthcheck reports failure on macOS: the most common cause is that the parent process (Terminal, iTerm2, or the Stream Deck app) doesn’t have Accessibility permission. Grant it under System Settings → Privacy & Security → Accessibility.

Buffer Transforms

Every transform is reachable inside a keys chain as a {curly token}. The token form is the single source of truth — the same dictionary backs the Mac (TransformRegistry.keysCommandAliases) and Windows (TextTransforms.KeysCommandAliases) implementations. Each transform mutates the robo buffer (or the active selection, in Textulon) and leaves the rest of the chain to act on the new contents.

TokenEffect
{auto}Sniff content kind and apply the best-fit transform.
{rot13}ROT-13 on letters (reciprocal — apply twice to undo).
{rot18}ROT-13 letters + ROT-5 digits (reciprocal).
{uppercase}Uppercase the whole buffer.
{lowercase}Lowercase the whole buffer.
{trim}Trim leading/trailing whitespace from the buffer.
{trim lines}Trim each line independently.
{sort lines}Sort lines (localized standard compare).
{unique lines}Drop duplicate lines, first-seen order.
{sort unique lines}Combine sort + unique.
{json beautify} · {json minify}Format JSON with sorted keys, or compact it to one line.
{xml beautify}Reformat XML with indentation.
{html escape} · {html unescape}Encode/decode &, <, >, ", named & numeric entities.
{url encode} · {url decode}RFC 3986 percent-encoding / decoding.
{base64 encode} · {base64 decode}Base64 against UTF-8.
{remove query}Strip everything from the first ? onward — handy for URL cleanup.
{ascii}Extract printable ASCII / UTF-8 runs from binary noise (min length 6, 80% alpha-ish; newline-joined output).

Inside a Stream Deck chain, the typical pattern is {cmd+c}{grab}{transform}{put}{cmd+v} — copy the selection, lift it into the buffer, run a transform, push back to the clipboard, paste in place.

Stream Deck Integration

Mac-A-Tron is the macOS Stream Deck plug-in that exposes robo as a set of UI actions. WinTronic is the Windows counterpart — separate name because the two plug-ins have slightly different action sets, but both call into robo under the hood. Each plug-in ships the platform-appropriate robo binary in its bundle, so installing the plug-in is usually how robo first lands on a system.

The plug-in actions and their underlying robo commands:

ActionUnderlying command
Keyboard Shortcutrobo keys "<chain>"
Transform Textrobo keys "{cmd+c}{grab}{transform}{put}{cmd+v}" or, on Mac-A-Tron only, hands the buffer to Textulon
Browser Tabrobo browser-tab
Browser Defaultrobo browser-default
Move Mouserobo move-mouse
Move Approbo move-app

Windows Version

Robo also ships as a native Windows executable, robo.exe. It is required by WinTronic and is bundled inside the WinTronic Stream Deck plug-in, so normal WinTronic users do not need to install it separately.

The Windows version intentionally tracks the Mac command surface closely: keyboard chains, clipboard copy/paste, buffer transforms, Transform Text, Browser Tab, mouse placement, window movement, settings, and diagnostics are present. It is nearly, but not completely, the same as the Mac implementation because some operating-system behaviors differ.

Notable Windows differences: Browser Tab is slower than the macOS implementation, and Default Browser cannot silently switch the system default; it opens the Windows Default Apps settings location instead.

The standalone robo.exe download is useful for scripts, shell aliases, and testing outside Stream Deck.

Cross-Platform Notes

The CLI surface is intentionally identical on macOS and Windows, but a handful of details differ where the OS forces them to:

ConcernmacOSWindows
BinarySwift (RoboCore).NET 8 (RoboWin)
{cmd+*}Real ⌘Aliased to Ctrl — so chains are portable
browser-default setSilentOpens ms-settings:defaultapps (system policy)
Permissions gateAccessibility (System Settings)No equivalent gate — UI Automation works without prompt
Settings store~/Library/Application Support/com.robomac.robo/%APPDATA%\com.robomac.robo\
Wire-line transforms. The curly-token dictionary above is the contract: the same input bytes produce the same output bytes on both platforms. If you find a divergence, that’s a bug.