Browser automation you can leave running.
Starfysh compiles a one-time agent recording into a deterministic Playwright script. When the site changes, a healer patches the smallest possible piece, re-verifies, and shows you a diff. The agent is never in the loop for ordinary runs.
Agents cost too much per run.
Running a live AI agent on a cron schedule costs orders of magnitude more per workflow than a compiled Playwright script. You should pay for intelligence once, not on every execution.
Compiled scripts break silently.
A locator drifts. CI goes red. You find out three PRs later. The script has been broken for a week and nobody knew.
Self-healing tools lie to you.
Most auto-repair tools patch the symptom and ship. The test goes green. The wrong element was clicked. The regression ships.
How it works
Record once with an AI agent
Describe the task. The agent drives a real browser under instrumentation and the compiler turns the trace into a typed, deterministic Playwright script.
Verifier locks in a baseline
Replays the script N times against the live site to confirm stability before you ship it. A script that passes once is not a baseline.
Healer proposes, you approve
When the site changes, the healer triages the failure, patches only the broken step in the IR, re-verifies, and shows you a semantic diff. Accept or reject.
False-heal rate
Data coming soon
published at first stable release
Industry average: unreported
No other tool publishes this number.
We publish our false-heal rate.
Nobody else does.
A false heal is when the healer patches a broken step, all verification runs pass, but the script is now interacting with the wrong element. The patch found something clickable. The run is green. The regression ships. Your data is wrong.
This is the failure mode that makes self-healing automation untrustworthy. Most tools don't measure it. We treat it as the primary quality metric and publish it openly, because it's the only number that tells you whether to trust a healed script.
Semantic diff
Every proposed heal ships as a diff. Selector swapped, waitForNavigation replaced with waitForURL. Read it, approve it, or bin it.
await page.goto("/checkout")await page.fill('#email', user.email)await page.fill('#password', user.password)-await page.click('#checkout-btn')-await page.waitForNavigation()await expect(page).toHaveURL('/confirmation')
await page.goto("/checkout")await page.fill('#email', user.email)await page.fill('#password', user.password)+await page.click('[data-testid="checkout"]')+await page.waitForURL('**/confirmation')await expect(page).toHaveURL('/confirmation')
In development
Building in public. Apache 2.0.
The healer and verifier are in active development. The IR schema is frozen, the compiler is working end-to-end, and the first public release ships with a 20-task benchmark and a published false-heal rate. Follow the build on GitHub or get notified when the first stable version ships.