appwalk sends an AI through your app like a real user, then keeps only the flows that survive a clean, deterministic replay.
npx @kubstack/appwalk run <url> --provider openai --model gpt-4o
Give appwalk a URL, a provider, and a model. Add a persona, scope, or expectation only when you want to focus the run.
An AI drives a real browser like a first-time user, or any persona you pick.
Every discovered flow runs again, deterministically, from a blank slate.
Only flows that survive replay become a spec you can run without AI.
Get E2E coverage going for an app that has little or none today.
Turn a newly shipped feature into a regression test without writing the first journey by hand.
Check accessibility, validation, permissions, and race conditions with focused personas.
Once verified, the generated test runs like any other Playwright spec — no model, no key.
Results land in your existing Playwright project. No new runner, no new format.
First-time visitor takes the most direct, obvious path.
Clicks around and backtracks, but still completes the flow.
Returning user checks history, drafts, and saved state.
Real phone profile; sweeps flows for layout and reachability.
Completes a flow using only the keyboard, never a click.
Checks hover-only content is reachable without hovering.
Enters non-Latin scripts, right-to-left text, locale formats.
Back/forward/reload mid-flow, checks what survived.
Changes an earlier choice, checks downstream updates.
Clears cookies mid-flow to simulate an expired session.
Cancels, deletes, or unsubscribes, then verifies it took effect.
Pushes long text and large data sets looking for broken layout.
Injects network latency, checks for duplicate submissions.
Triggers a real export and confirms a real file was produced.
Submits invalid or hostile values, records what got through.
Creates the same thing twice, checks for duplicate detection.
Uploads wrong-type, empty, or oversized files.
Never logs in, tries to reach protected pages directly.
Tries a neighboring resource ID or an unlinked admin URL.
Tries to reach a plan-gated or quota-limited feature directly.
Fires the same action rapidly, checks for duplicate submission.
Edits the same record from two open tabs at once.
Backs out at the last moment, checks nothing was committed.
Injects a network failure, checks the app recovers cleanly.
Not just a test file — a full run leaves a human-facing report, raw evidence, and machine-readable data behind. The spec is generated only for flows that passed deterministic replay.
appwalk-output/<run-id>/
The human-facing summary — flows found, replay results, and any findings.
Generated only for replay-confirmed flows — an ordinary Playwright test that runs without AI.
test('Checkout: place an order', async ({ page }) => {
await page.goto('https://your-app.example');
await page.getByRole('button', { name: 'Place order' }).click();
await expect(page.getByRole('heading', { name: 'Order confirmed' })).toBeVisible();
});
The same data as the HTML report, for CI and tooling.
Screenshots and traces captured for each step.