Pushbuild

Groove docs

This is the reference for the files Groove exports and imports and the tools it gives AI agents. Everything here is built to be read by an agent: hand this page, or the files linked below, to your agent along with a recording or groove.

1. Downloads

filewhat it is
groove.schema.jsonJSON Schema for a groove (format groove, version 1). Validate against it before you give a groove back.
SKILL.mdInstructions for an agent: how to read a recording, find what to automate, write a groove, and change one. Works as a Claude skill.
sample.groove.jsonA small working groove: opens a Wikipedia article and copies its summary.

Every recording bundle and groove pack Groove exports already contains the schema and SKILL.md, so an agent given one of those files needs nothing else.

2. Groove bundles (recordings)

A recording is a recording of real browser work. Download for an agent on a recording makes groove-<name>.zip:

filewhat it is
README.mdStart here: when, which sites, and every step in plain words, with the person's notes.
manifest.jsonFormat recording, label, time range, sites, and the person's note on the recording.
steps.jsonlOne step per line: action, tab, frame, url, target, value, text, comment.
context.jsonSites used, their pages, form fields filled, and the busiest network endpoints.
network.jsonlNetwork metadata (method, URL, status, timing). No bodies.
events/*.jsonFull page recordings (rrweb format), one per tab and frame. Large; use only when steps are not enough.
groove.schema.json, skills/groove/SKILL.mdThe format to write and how to write it.
Masked valuesValues shown as [REDACTED] or ••• were hidden on the person's computer before they were stored. They are not in the file. Never guess them: make them a variable with "secret": true.

3. The groove format

A groove is one JSON object:

{
  "format": "groove", "version": 1,
  "name": "Add a customer note",
  "description": "What it does and why, in plain words.",
  "variables": [
    { "name": "customer", "label": "Customer name" },
    { "name": "note", "label": "Note", "default": "Called, no answer" },
    { "name": "region", "kind": "setting", "value": "east" }
  ],
  "steps": [
    { "action": "goto", "url": "https://crm.example.com/customers", "note": "Open customers" },
    { "action": "type", "target": { "role": "textbox", "name": "Search" }, "value": "{{customer}}" },
    { "action": "press", "key": "Enter" },
    { "action": "click", "target": { "role": "link", "name": "{{customer}}" } },
    { "action": "type", "target": { "role": "textbox", "name": "Note" }, "value": "{{note}}" },
    { "action": "click", "target": { "role": "button", "name": "Save" }, "confirm": true },
    { "action": "waitFor", "text": "Note saved" }
  ]
}
fieldmeaning
variablesInputs (kind: "input", the default) are asked for each run, prefilled with the last value or default. Settings (kind: "setting") are saved with the groove as value. Names match ^[a-z][a-z0-9_]*$; steps use them as {{name}}. "secret": true values never leave the browser in an export.
stepsRun in order. Up to 500. See the step reference below.
schedule{ "every": "minutes" | "hour" | "day" | "weekdays", "n": 15, "at": "08:00" }. Scheduled runs use last values or defaults, so give every input a default. Approved grooves only.
askInputsfalse to skip the input form when a person runs it.
lineageSet by Groove on export. Leave it exactly as it is when you change a groove.

4. Step reference

Targets. Elements are found by a target object. Groove tries testid, then role + name, then text, css and xpath. Copy targets from a recording's steps.jsonl rather than writing selectors by hand.

actionfieldsdoes
gotourlOpen a page. Must be http(s), or start with a {{variable}}.
click, check, unchecktargetClick or set a checkbox.
type, selecttarget, valueFill a field or pick an option.
presskeyPress a key, such as Enter.
extracttarget, saveAsRead a value into a variable. Every saveAs is also an output of the run.
extractAllitem, fields, saveAs, next, maxPages, onlyNew, keyRead every matching element into rows (field attr: text, href or src). Pages through with next; onlyNew keeps rows not seen before.
waitFor, asserttext or targetWait for, or require, proof a step worked. A failed check stops the run.
notifymessage, ifSend the person a notification, optionally only if a text shows or a list has rows.
newTab, switchTab, closeTabtab, urlWork across tabs.
wait, scroll, back, reload, notePause, scroll, navigate, or leave a note for the person.

Any step can carry confirm: true (the person approves it during the run: use it on anything that submits, sends, pays or deletes), frame (an iframe's CSS selector), note (shown to the person) and comment (why the step is there).

5. Groove packs: change a groove and give it back

Download for an agent on a groove makes <name>.groove.zip:

filewhat it is
README.mdThe groove in plain words: every step, input and setting, and how to give it back.
groove.jsonThe groove, with lineage. Results, last values and secret values are removed.
manifest.jsonFormat groove-pack, and the sites the groove visits.
groove.schema.json, skills/groove/SKILL.mdThe format and the instructions.

To change it, an agent edits groove.json, keeps lineage, and gives back either groove.json or the zip. The person imports it (Grooves → Import). Groove matches the lineage and adds the edit as a new draft beside the original, which is left untouched, then shows a review of every added, removed and changed step, variable and setting, plus any site the groove did not visit before. Nothing runs until the person approves it.

Groove's review of an agent's changes to a groove
An edited groove arrives with a list of exactly what changed, and flags the new site it visits.

6. Connect an agent over MCP

In Groove, turn on Connect an agent and copy the link. Add it to your agent as an MCP server. For Claude Code:

claude mcp add --transport http recording https://groove.pushbuild.com/mcp/<your link>

Any client that supports remote MCP servers over HTTP works the same way. The relay at groove.pushbuild.com only passes messages between your agent and your browser, and stores nothing. Making a new link cuts every agent off the old one.

7. MCP tools

toolwhat it does
search_historySearch what the person did (masked): step text, page URLs, element names. Filter by site and days.
list_recordingsThe recordings (labelled recordings) the person has made.
get_recordingRead a recording, or a time range of the always-on history: steps with targets, sites and form fields.
find_repeatsRoutines the person repeats, how often, time spent, and which typed values change. Good groove candidates.
read_pageThe page open in the current tab: title, URL, interactive elements and visible text, masked. No screenshot.
list_groovesThe person's grooves and whether each is approved to run.
get_grooveOne groove in the portable format, with lineage, to explain or change it.
propose_grooveGive the person a new or changed groove. It arrives as a draft, with the review of changes and new sites.
run_grooveRun an approved groove and get its outputs back. The person sees its input form first unless the groove turns that off.

8. Safety rules agents work within

  • Agents see masked data only. Passwords and card numbers are never recorded at all.
  • A groove from an agent is always a draft. It cannot run until the person approves it and has run it once, step by step.
  • Steps marked confirm wait for the person every time. Keep them on anything that pays, sends or deletes.
  • Imports refuse non-web URLs (such as javascript:) and grooves over 500 steps.
  • Exports never include secret values, past results or past inputs.

For using Groove itself, see the guide.