For developers who ship by vibes
The AI wrote your app.
Lastest writes the tests.
You prompted, regenerated, and shipped in a weekend. Now add real E2E and UI regression tests without opening Playwright docs. Click through your app once - AI turns it into resilient tests. Every run after that is free.

Vibe Check
- Every vibe coder, 11 PM on a Friday
- You, 10 minutes before a demo
- Also you
Why Not Just Ask Claude?
You can ask the AI to test it. You probably already tried. Here's why it broke.
Testing AI-generated code is a different problem than generating it. Industry reviews keep finding that AI co-authored code ships with more defects than human-written code, and LLMs write tests where it's easiest, not where regressions hide. Four things you might try - and where each one fails.
Ship nothing. Hope for the best.
Your app looks fine on localhost. You demo it. It works. Three prompts later the agent refactors a component and silently breaks checkout. You find out from a user. Or a tweet.
- Zero regression coverage
- No record of what used to work
- Every prompt is a coin flip
Just ask Claude to test it.
The LLM runs the flow in a chat, declares it works, and moves on. It never runs the same way twice. There's no artifact, no history, no diff. And every single re-run burns tokens.
- Non-deterministic - different selectors, different paths, different results each run
- Tokens compound - every re-run on every commit costs real money
- No oversight - the model grades its own homework
- Can't run in CI without a babysitter
Let the AI write Playwright tests.
Better - there's code now. But LLMs write tests where they're easiest (the feature it just built, while the context is fresh) using whatever selector lands first: Tailwind classes, text content, nth-child. One UI tweak and everything red-fails.
- Brittle selectors - break on every redesign
- Coverage bias - tests the happy path, ignores the regression zone
- DOM-only - passes even when the UI visibly broke
- Hours of manual selector maintenance every month
Use Lastest. Generate once. Replay forever.
AI generates the test once. Lastest stores it as deterministic Playwright code with multi-selector fallback, captures a visual baseline, and replays the exact same thing on every commit - no AI calls, no token cost, no drift.
- Deterministic replays - same code, same DOM checks, same screenshots, every run
- Zero tokens after generation - run 10,000 times for $0
- Visual diff catches what DOM tests miss - 3 diff engines (pixel, SSIM, perceptual)
- Self-healing selectors - 7-layer fallback (data-testid → id → role → aria → text → css → OCR)
- Human-in-the-loop dashboard - you review, approve, reject
- AI failure triage - auto-classifies real regression vs flaky vs env issue
“The problem with letting Claude test your code is that Claude tests everything except the one thing that mattered. Lastest makes you decide what matters - once - and then guards it forever.”
Built for Your Workflow
Vibe code the feature. Vibe test it too.
Lastest is how AI-first developers add real E2E coverage without breaking their flow. Point, click, and approve - the way you already work. Four features that matter.
01 · Record
Click through your app. That's the test.
Open the recorder, perform the flow you care about, hit stop. Lastest captures every click, type, and navigation and generates deterministic Playwright code with multi-selector fallback (data-testid → id → role → aria-label → text → css → OCR). No selectors to maintain. No docs to read.
- Auto-detects file upload, clipboard, downloads, network
- Works with local, remote, or embedded browser
- Captures multi-step screenshots per test run

02 · Generate
Feed it a URL. Get a test back.
Don't even want to click? Paste a URL, a user story, or an OpenAPI spec. AI explores your app, extracts test cases, and writes them for you. Use Claude, OpenAI, OpenRouter, or local Ollama - your keys, your models.
- Spec-driven testing from markdown or OpenAPI
- Codebase intelligence - detects framework, auth, state
- AI Test Fixing when something breaks (up to 3 attempts)

03 · Autonomous
One click. Full coverage from scratch.
The Play Agent runs an 11-step pipeline: scan routes, plan functional areas, generate tests, run them, fix failures, re-run, and report. Specialized sub-agents (Orchestrator, Planner, Scout, Diver, Generator, Healer) handle the work. It pauses and asks when it gets stuck. You resume. It keeps going.
- Auto-discovers routes from your source code
- Applies testing templates (SaaS, marketing, e-commerce, SPA)
- WCAG 2.2 AA accessibility scoring on every build

04 · Catch regressions
Did the last prompt break the UI?
Every test captures screenshots and diffs them against approved baselines using three diff engines: pixelmatch, SSIM, and Butteraugli. Text-region-aware comparison reduces false positives from dynamic content. Review changes with a slider - approve or reject in one click.
- Auto-mask timestamps, UUIDs, relative times
- AI failure triage: regression vs. flaky vs. env issue
- Branch-to-branch compare for PR review

MCP Server
Your coding agent can run your tests now.
Lastest ships with a Model Context Protocol server that exposes 20 tools to any MCP-compatible agent - Claude Code, Cursor, Windsurf, or your own.
Your agent can create tests, trigger builds, review diffs, approve baselines, check coverage, and heal broken selectors - all without you leaving the chat. Pair it with the VSCode Extension API for full IDE integration.
One install. Zero boilerplate. Your testing infrastructure becomes a first-class citizen in any agentic workflow.
# Install the MCP server
$ npx @lastest/mcp-server
# In Claude Code:
> run all tests on the checkout flow
✓ calling lastest.run_tests { area: "checkout" }
✓ 12 tests queued
✓ 11 passed, 1 visual diff flagged
> show me the diff
✓ calling lastest.review_diff
button.primary shifted 4px → looks
intentional. want me to approve it?
Plays nice with your stack
Generate once.
Replay forever.
Zero tokens.
Vibe coding burns tokens fast enough already. Lastest uses AI only when you create or fix a test. Every subsequent run is pure Playwright execution - no AI calls, no per-screenshot fees, no CI bills that scale with your test suite.
Self-host in one command
docker-compose up -d. Your screenshots never leave your infra. Your source code never leaves your infra. Your keys are yours.
Run tests on every push
GitHub Action, webhook, cron schedule, or Smart Run (analyzes git diffs to run only affected tests). Since replays are free, run them as often as you want.
Bring your own AI
Claude CLI, OpenRouter, Anthropic API, OpenAI, or Ollama. Use a different provider for diff analysis than test generation. No lock-in. No upcharge.
Common questions for vibe coders
- How do I test an app I vibe-coded with Cursor or Claude Code?
- Point Lastest at your running app, click through one happy path, hit stop. Lastest generates deterministic Playwright code with 7-layer selector fallback and a visual baseline. Every subsequent commit replays it automatically, with no token cost and no manual maintenance. The recorder works whether your code came from Cursor, Claude Code, Windsurf, or your own keyboard.
- Can't I just ask the LLM to run my tests?
- You can, but it will not be deterministic. An LLM runs a slightly different path every time, grades its own output, and charges tokens per run. Lastest uses AI once to generate the test, then replays pure Playwright code forever: same path, same assertions, same screenshots, zero tokens. The model never grades its own homework.
- Why visual regression testing and not just DOM assertions?
- DOM-only tests pass even when your UI is visibly broken: wrong color, collapsed layout, missing icon, off-by-4px button. Lastest captures screenshots on every run and compares them with three diff engines: pixelmatch (pixel-exact), SSIM (structural), and Butteraugli (perceptual). You see the regression, not just a green check.
- My selectors break every time the AI redesigns something. How does Lastest survive that?
- Seven-layer selector fallback: data-testid, id, role, aria-label, text, CSS, OCR. When the primary selector fails, Lastest walks the chain until something matches, so a Tailwind refactor or component rewrite usually passes untouched. If the whole chain breaks, AI Test Fixing proposes a patch you approve in one click.
- Does it work with v0, Lovable, Bolt, and Windsurf apps?
- Yes. Lastest tests the running application, not your codebase, so it works with anything that serves HTML over a URL: Next.js, Vite, Remix, Astro, static exports from v0 or Lovable, Bolt previews. Point it at the deployed URL or a local preview and record. Dedicated walkthroughs live at /for/v0-apps, /for/lovable-apps, and /for/bolt-apps.
- What does the MCP server actually let my coding agent do?
- Twenty-nine tools: create tests, trigger builds, run specific test suites, review visual diffs, approve baselines, check coverage, heal broken selectors, and classify failures. Your Claude Code, Cursor, or Windsurf agent can run the full Lastest suite and report results without you ever leaving the chat window.
- Is Lastest actually free, or is there a catch?
- Actually free. FSL-1.1-ALv2 licensed, self-hosted on your infra via Docker Compose. No seat limits, no per-screenshot fees, no feature gates. You pay for AI tokens only during test generation, or run local Ollama models and pay nothing at all. Self-hosted Lastest costs $0.
- Can I run it in CI on every commit without burning tokens?
- Yes. Lastest replays are pure Playwright execution with zero AI calls per run. Wire up the GitHub Action or GitLab CI template and run on every push; your CI bill stays flat no matter how large your suite grows. Smart Run can also limit replays to tests affected by the git diff.
Add E2E tests
to your vibe app.
In five minutes.
No cloud account. No API key. No procurement process. No seat limits. No per-screenshot fees. It's open source, FSL-1.1-ALv2 licensed, and costs $0 forever.
★ Star & Install from GitHub →# 1. clone
$ git clone https://github.com/las-team/lastest
# 2. start
$ cd lastest && docker-compose up -d
# 3. record your first test
$ open http://localhost:3000
✓ you're done. go build something.