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.
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.
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.
On macOS, key-typing and window movement require Accessibility permission:
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 keysType 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}"
keys chains)| Token | What 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.
robo keys "{cmd+c}{grab}{trim after ?}{insert before http:{slash}{slash}archive.is{slash}}{paste}"
robo paste · robo copyCross-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-tabSwitch 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-defaultList, 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-mouseMove 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-appMove 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 settingsRead 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 healthcheckVerify 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.
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.
| Token | Effect |
|---|---|
{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.
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:
| Action | Underlying command |
|---|---|
| Keyboard Shortcut | robo keys "<chain>" |
| Transform Text | robo keys "{cmd+c}{grab}{transform}{put}{cmd+v}" or, on Mac-A-Tron only, hands the buffer to Textulon |
| Browser Tab | robo browser-tab |
| Browser Default | robo browser-default |
| Move Mouse | robo move-mouse |
| Move App | robo move-app |
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.
The standalone robo.exe download is useful for scripts, shell aliases,
and testing outside Stream Deck.
The CLI surface is intentionally identical on macOS and Windows, but a handful of details differ where the OS forces them to:
| Concern | macOS | Windows |
|---|---|---|
| Binary | Swift (RoboCore) | .NET 8 (RoboWin) |
{cmd+*} | Real ⌘ | Aliased to Ctrl — so chains are portable |
browser-default set | Silent | Opens ms-settings:defaultapps (system policy) |
| Permissions gate | Accessibility (System Settings) | No equivalent gate — UI Automation works without prompt |
| Settings store | ~/Library/Application Support/com.robomac.robo/ | %APPDATA%\com.robomac.robo\ |