Product

Every surface you touch, from first click to filed bug.

Map a flow, it becomes code, the code runs, failures become bugs.

Where every flow starts

Mapping sessions

  • Drive it by hand — click, drag, type — each step lands on the timeline with a screenshot. Reorder, remove, then save as a named flow.
  • Or type a goal, like Go to {site} and sign in with {email}/{password} — the operator drives it via OCR, stamped with decided_by and cost. Credentials fill in at run time, never stored in the flow.
Surface

Flows

Every saved session becomes a flow — name, site, steps, status. Replay it, send it to Automate, or run its test.

FlowSiteStepsTest codeLast run
Sign in with email + password
Go to {site} and sign in with {email}/{password}
app.example.com7generatedpassed
Add item to cart and checkoutshop.example.com12generatedfailed

Illustrative — not a customer flow.

Automate job

Flow: Sign in with email + password

Status: runningdone

File: src/sign-in-with-email-password.spec.js

Assertions by: deepseek/deepseek-chat

Surface

Automate jobs

An Automate job turns a flow into real Playwright test code — navigation, fills, clicks, assertions — with the proposing model recorded on the job. It opens in the IDE to read, edit, or hand to chat.

Surface

IDE

A file tree and code editor next to the chat agent. Generated tests are ordinary .spec.js files — open, edit, save, nothing locked behind the UI.

  • "Run this test" executes the open file, like a flow's Run test button.
  • Ask the agent to explain, fix the last failure, or iterate until it passes.
src/sign-in-with-email-password.spec.js
test('sign in with email + password', async ({ page }) => {
  await page.goto(env.baseUrl);
  await page.getByLabel('Email').fill(params.email);
  await page.getByLabel('Password').fill(params.password);
  await page.getByRole('button', { name: 'Sign in' }).click();
  await expect(page.getByText('Welcome back')).toBeVisible();
});
Surface

Runs

A run records status, duration, and error, plus a screenshot and trace to scrub through — not just a red dot.

RunFlowEnvStatusDurationError
run_2f81Sign in with email + passwordstagingpassed4s
run_2f82Add item to cart and checkoutstagingfailed9sTimeout waiting for "Order confirmed"

Illustrative. Runs report three states, not two — see why UNMEASURED exists.

Surface

Bugs

A failed run auto-files a bug — title, flow, environment, error, link to screenshot and trace. Triage starts from evidence, not a report to reproduce.

Checkout: "Order confirmed" not visible

run_2f82 · staging · open

Timeout waiting for "Order confirmed" — 30000ms exceeded.

Surface

Maintenance

Every flow whose last run failed shows up here, linked to its test. Empty list means everything passed.

1 flow needs maintenance — last run failed:

  • Add item to cart and checkout — open test
Configuration

Environments

Pick a named environment — staging, prod, or custom — from a dropdown next to every "Run test" action. Base URLs and parameters live here, so the same flow runs anywhere.

Cost, out loud

A running total, not a mystery invoice.

Every screen shows spend and model — the same number the product header keeps live. Calls are logged, not estimated after the fact.

$0.0074 spent · deepseek/deepseek-chat

Illustrative — cost accrues per model call.