Someone on Slack said "hey, can you make sure the checkout flow doesn't break again?" and now you own QA. There is no QA team. There is no budget. Your roadmap was already too long last quarter. You have maybe two hours this afternoon before the next meeting eats your brain.
This post is for you. We are going to ship E2E tests without a QA team, going from zero tests to a real browser safety net running in GitHub Actions in one sitting, without writing a single line of Playwright by hand. No corporate framework rollout. No "testing culture" offsite. Just the five flows that matter, recorded, committed, and gating your PRs by dinner. The whole stack is free and open source, so the only thing this costs you is the afternoon.

Why your unit tests are not saving you
You probably already have some Jest or Vitest coverage. That is great for pure functions and hooks. It is not what breaks in production. What breaks in production is the stuff between the pieces: a Stripe redirect that drops a cookie, an auth callback that races a server component, a form that submits twice on slow 3G, a CSS change that hides the "Pay" button on mobile.
Unit tests cannot see any of that. They mock the browser away on purpose. You need something that actually drives Chrome, clicks the button, and yells when the screen does not look right.
There is another reason this matters more than it used to. If you or your teammates are pairing with Copilot, Cursor, or Claude all day, you are shipping more code, faster, than a human-only team would. More code means more surface for the gap-between-the-pieces bugs that unit tests cannot see. Your bug surface grew, and nobody added a QA person to match.
And ironically, asking those same tools to write your E2E tests from a plain prompt is painful. An LLM staring at a blank file tends to write tests where they are easiest, not where regressions hide, and the selectors it invents are brittle the moment the DOM shifts. So writing tests by hand is slow, and generating them cold from a prompt is flaky. We need a third option: record the flow once, let the tool turn it into resilient code, then replay it deterministically forever. That replay costs zero AI tokens, which is the whole reason this scales to a one-person team.
The five flows every web app should cover
Forget 80 percent coverage. You are one person. Your goal today is a safety net, not a museum. These are the only five flows you need to start with:
- Signup. A new user can create an account and land on the first-run screen. If this breaks, you have no business.
- Auth. An existing user can log in, log out, and come back. Covers session, cookies, and OAuth callbacks.
- Core action. Whatever your app exists to do. Send a message. Create a project. Upload a file. Run the query. One flow, happy path.
- Billing. If you take money, test the checkout. Stripe test mode is free, and a broken checkout is the single scariest production incident a small team can ship, so this is the flow you least want to leave uncovered.
- Navigation. The top nav, the main links, the 404. One spec that just walks the site and checks nothing throws.
Five flows. That is the whole afternoon. If you cover these, you have eliminated the class of outage where someone merges a config change on Friday and nobody can log in all weekend.

Step 1: install Lastest locally (10 minutes)
We are going to use Lastest, which is a free, open-source, self-hosted E2E and visual regression tool. It is licensed FSL-1.1-ALv2, so you can run it on your own infra, in CI, wherever, with unlimited screenshots and replays. There is no SaaS seat cost and no "contact sales." If you would rather skip the ops entirely, self-hosting stays free forever and Lastest Cloud is a flat $299 per month with no per-seat or per-screenshot fees, but for this afternoon we are running it locally for $0.
One nice detail for the AI step: Lastest is bring-your-own-AI. Point it at your Claude CLI, an Anthropic or OpenAI key, OpenRouter, or a local Ollama model. You are not locked into one provider, and the keys only get used when you create or fix a test, never on replay.
Clone it and bring it up with Docker:
git clone https://github.com/las-team/lastest
cd lastest
docker-compose up -d
That is it. You now have a browser recorder, a Playwright runner, and a visual diff pipeline running on your laptop. Open the UI in your browser. If you are building on Next.js, React, or Vue, the defaults already understand your dev server. There are setup notes specific to each stack over at Lastest for Next.js apps if you want to skip ahead.
Step 2: record your first flow (15 minutes)
Point the recorder at your local dev server. Click through the signup flow like a normal user. Fill the email. Pick a password. Submit. Land on the dashboard. Stop recording.
What you get back is not a fragile screen recording. It is deterministic Playwright code, with a 7-layer selector fallback baked into every step. When Lastest records a click, it captures the element seven different ways at once: data-testid, then id, then ARIA role, then accessibility label, then visible text, then CSS selector, and finally OCR as the last resort. If a future refactor strips the id, the test falls back to the role. If the role changes, it falls back to the text. If the text is wrapped in an SVG, OCR reads the pixels.

This is the difference between a test that survives a design refresh and one you throw out in March. It is also why you can record instead of write, and why the result is genuinely self-healing. The fallback chain is doing the work a careful engineer would do manually, every single time. There is a deeper walkthrough in how self-healing selectors work for developers if you want the mechanics.
While recording, Lastest also snapshots the screen at each step. Those become your visual regression baselines, diffed in CI by three engines you can mix and match:
- pixelmatch for pixel-exact comparisons on logo pages and marketing hero sections.
- SSIM for structural similarity, which tolerates anti-aliasing and font rendering drift.
- Butteraugli for perceptual diffs that match what a human eye would actually notice.
Use SSIM as your default. Switch to Butteraugli for pages with a lot of imagery. Save pixelmatch for components you know should never move a pixel.
Step 3: record the other four (30 minutes)
Same loop. Log in as an existing user. Do the core action. Run a Stripe test checkout. Walk the nav. Each recording takes three to five minutes. Name them clearly: signup.spec, auth.spec, create-project.spec, billing.spec, nav.spec.
Commit them to your repo under tests/e2e. They are just Playwright files. Your teammates can read them. Your LLM can read them. Git can diff them. There is no proprietary format locking you in.
Step 4: wire into GitHub Actions (20 minutes)
Add a workflow at .github/workflows/e2e.yml. The pattern is: spin up your app, spin up Lastest via its Docker image, run the suite, upload the visual diff report as an artifact on failure. The Lastest repo ships a reference workflow you can copy almost verbatim.
Two things to get right on the first try:
- Run against a preview deploy, not
localhost. Vercel previews, Netlify previews, or a per-PR Docker stack all work. Testing against a real URL catches environment bugs that local never will. - Make it required. Go into branch protection and mark the E2E job as required for merge. If it is not blocking, it will be ignored within two weeks and you are back where you started.
That is your safety net. Five flows, real browser, real screenshots, gating every PR.
Step 5: what to do when the first flake happens
It will happen. Probably tomorrow. A test will go red on main and you will have no idea why. Do not panic, and do not delete the test.
Open the failure report. Lastest ships a timeline view that shows you exactly which selector layer fired, the DOM snapshot at that step, and the visual diff if one is present. It also auto-classifies every failure as a real regression, a flake, an environment issue, or test-maintenance, with a confidence score and reasoning, so you are not guessing which of those three things you are looking at. Nine times out of ten it is a copy change nobody told you about, a loading state that got slower, or a genuine bug. All three are useful information.
If it is flake, open the recording, re-record just the affected step, commit. The test is back to green in a couple of minutes. This is the workflow that makes the whole thing sustainable when you are a team of one: the recorder plus a 7-layer fallback plus auto-classification means most weeks you spend almost no time babysitting the suite, because the maintenance work a careful engineer would do by hand is already automated.
If you are using Claude Code, Cursor, or Windsurf as your daily driver, you can also point them at the Lastest MCP server, which exposes roughly 20 tools for recording, running, diffing, and triaging. Your agent can now fix its own broken tests without you opening the browser. There is also a Play Agent, an 11-step autonomous pipeline of specialized sub-agents (orchestrator, planner, scout, generator, healer, and more) that can plan, generate, run, and heal a failing flow end-to-end and open a PR with the fix. You can pause, approve, or skip any step. Use it sparingly at first, but it is there when you need to walk away from the keyboard.
What you just shipped
In one afternoon you went from no tests to a browser-backed, visually diffed, CI-gated safety net covering the five flows that actually break revenue. You did not write Playwright by hand. You did not buy a SaaS seat. You did not have a QA kickoff meeting.
That is the bar. Not 80 percent coverage. Not a testing pyramid. A safety net that catches the incidents that would ruin your Saturday. Everything you add from here is bonus.
If you want a deeper walkthrough built specifically for developers in your exact situation, including playbooks for onboarding a teammate and scaling past the first five flows, we maintain a running guide at Lastest for devs doing QA, and you can see the full feature set on the features page.
Ready to ship E2E tests without a QA team? Self-host Lastest for free, forever, clone it from las-team/lastest on GitHub, and have your first flow recorded before this afternoon is over. If you would rather skip the ops, Lastest Cloud is a flat $299 per month with no per-seat or per-screenshot fees. Either way the replays are free. Now go close your laptop, you earned it.
