Field Notes

Control surfaces: Mac automations that stop and ask you

Most automations run unattended. These five surfaces let a flow on your Mac stop and ask you: a form, a chooser, a chat window, a full editor and a webhook.

Most writing about Mac automation is about the kind that runs while you are not looking. A file lands, a schedule fires, something happens in the background, and the best outcome is that you never think about it again.

A lot of what I wanted to automate was not like that. A bug to triage. An idea I want to keep before it goes. A quick question for a model. Each of those needs something from me first: a sentence, a choice, a link. So I started building what I call control surfaces into Watchflows, the Mac automation app I make. A control surface is a small piece of interface a flow puts on screen when it needs you, and takes away when it has what it needs.

About 40% of my own flows are now started by hand from a keyboard shortcut, not by a file or a schedule. Here are the five surfaces I use most.

1. Form

Fig. 1A three-node flow on the canvas, Save a Link into Save Reading Link into Confirm Saved Link, with its Save a Link form open beside it showing Title and URL fields.

A form is the one to reach for when the input has a shape: a subject and a description, a title and a URL, a customer and an amount. You choose the fields, their labels, the title and the description. When you submit, everything you typed is packed up and handed to the next node.

Fig. 2The Save a Link panel. Title and URL are both marked required, Title shows a Required message in red, and the Save Link button is greyed out.

There are two Form nodes. The Form trigger starts a flow: press Run, fill it in, and the flow begins with your answers. The Form action sits in the middle of one: the flow runs up to that point, stops, waits for you, and carries on when you submit. In the middle of a flow the form can also use what came before it, so a form titled Triaging {{fileName}} shows the real file name.

Fields are typed and validated, so a required field stays required and an email field wants an email. The panel floats above your other windows, including full-screen apps, so you do not have to go and find it.

2. Pick from List

Fig. 3A chooser titled "Launch an app…" listing 1Password, Activity Monitor, App Store and other apps with their icons. 1Password is highlighted and the footer reads 127 results.

Pick from List is a chooser in the style of Spotlight or Raycast. It has no data of its own. It shows whatever list the node before it produced, and you type to filter, arrow to move and press Return to pick. The row you picked goes on to the next node.

That makes it a general tool, and the list decides what it becomes:

The launcher above is the first of those. It is four nodes: Keyboard Shortcut, Installed Apps, Pick from List and Open File.

3. Chat

Fig. 4An AI Chat window. The question asks for the next ten Dave Matthews Band concerts as a table, and the answer is a table of dates, venues and cities.

On its own the Chat node does very little. It opens a window, and it has two ports that matter: Call and Response.

Fig. 5Three nodes on the canvas. Open Chat feeds the Input of AI Chat. AI Chat's Call outlet goes to an Agent's Input, and the Agent's Result loops back to AI Chat's Response.

Every message you type goes out on Call. Whatever you wire behind it does the answering, and what arrives back at Response is shown as the reply. A new Chat node can search and read the web on its own. Wire Call to an AI Prompt for plain questions, or to an Agent, as in the picture, to add the tools you switched on for that agent.

The result is a chat window you open with a keyboard shortcut, running on whichever AI you already have: a model on your own Mac, your own API key, or a subscription you already pay for. There is no extra chat subscription in the middle. And because the answering part is a flow, you can change what the chat is for by changing the wires.

4. The Workbench

Fig. 6The HTML Editor in Split view. The page's markup is on the left with a variables rail beside it, and a live preview of a mine-clearing game called Tread Lightly is on the right.

The Workbench is a control surface for building, not for running. Prompts, scripts, SQL and HTML pages are long, and a small box in an inspector is a poor place to write them. The long fields on the AI Prompt, Agent, Run Script, Run SQL and HTML nodes open in a full window, with syntax highlighting and a rail of the variables that node can reach. Prompts and pages also get a live preview.

It also has an assist bar. With an AI provider set up, describe a change in plain words and it proposes an edit to the prompt, script, SQL or page. You apply it or not. Everything else in the Workbench works with no AI configured.

The picture shows the HTML editor, which pairs with HTML View: a node that shows a self-contained page and lets that page send an answer back to the flow. When a form, a chooser and a chat window do not fit, have an agent write the page and show it.

5. Public Webhook

Fig. 7The Public Webhook node's inspector. Its switch is on, and a status card reads Listening: connected to the relay and receiving requests at your public URL.

The last one is a control surface for other software. A Public Webhook trigger gives a flow a public HTTPS address, so GitHub, Stripe or a form on your website can start it. There is no port forwarding and no server of your own. Press Create Public URL, paste the address into the service, and the flow runs on your Mac when a request arrives.

The relay that makes this work is now part of the $49 license, at no extra cost. I use it to build Watchflows itself: a webhook from GitHub is what starts each release build.

Why this matters for local automation

When an automation runs on a server, getting a person into the loop is a project: an email, a link, a web page, a login. When it runs on the Mac in front of you, it is one node. The flow can put a panel on your screen, wait, and carry on.

So a shortcut opens a form, a chooser or a chat, and the rest of the flow does the tedious part. The same surface works in any flow, which is why I keep finding new places to put one.

Watchflows is $49 once, with a 14-day trial. Every surface here comes with the license. The public webhook needs an owned license or a Cloud plan, so it is the one that does not work during the trial.

Try one

The chat is the quickest to build. Paste this into the Flow Builder:

Paste into the Flow Builder

Build a flow that opens an AI chat window from a keyboard shortcut. Wire the Chat node's Call outlet to an Agent, and the Agent's Result back to the Chat node's Response, so each message I type is answered by the agent.

Then record a shortcut on the trigger, turn the flow on, and press it.