loading…
Search for a command to run...
loading…
MCP serverr for Lastest to manage your tests, AI create them, run them, and speed up AI-development.
MCP serverr for Lastest to manage your tests, AI create them, run them, and speed up AI-development.
Free, open-source visual regression testing with AI-generated tests
Record it. Test it. Ship it.
Website • Wiki • Features • Quick Start • How It Works • Why Lastest • Comparison • Commands • Config
Visual regression testing is either expensive, flaky, or painful to maintain.
Meanwhile, you just need to know: "Did my last commit break the UI?"
Lastest is a free, self-hosted visual regression testing platform that records your tests, writes them with AI, runs them anywhere, and fixes them when they break — all in one tool.
1. Point it at your app
2. Record your user flows (point-and-click, no code)
3. AI generates resilient test code with multi-selector fallback
4. Run on remote runners or in an embedded browser container (EB setup required)
5. Screenshots compared with 3 diff engines (pixelmatch, SSIM, Butteraugli)
6. Review and approve visual changes — or let AI auto-classify them
When self-hosted, your data stays on your server and your screenshots never leave your infra.
Lastest adapts to how you want to build tests — from fully manual to fully autonomous.
Open the recorder, click through your app, hit stop. Lastest captures every interaction and generates deterministic Playwright code — no AI involved, no API keys needed. You own the test code and can edit it by hand.
Best for: Teams that don't want AI, air-gapped environments, simple flows.
AI generates, fixes, or enhances tests — but you review and approve before anything is saved. Feed it a URL and get a test back. Import OpenAPI specs or user stories and AI extracts test cases. When a test breaks, AI proposes a fix and you decide whether to accept it.
Best for: Day-to-day development, iterating on tests, fixing breakages fast.
One click kicks off an 11-step pipeline: check settings, select repo, set up environment, scan routes & apply testing template, plan functional areas, review plan, generate tests, run them, fix failures (up to 3 attempts per test), re-run, and report results. Uses specialized sub-agents (Orchestrator, Planner, Scout, Diver, Generator, Healer). The agent pauses and asks for help only when it hits something it can't resolve on its own. You resume and it picks up where it left off.
Best for: Onboarding a new project, generating full coverage from scratch, CI bootstrapping.
Once your tests exist, you have two execution modes. Local Playwright execution on the host is no longer supported — every test runs inside an Embedded Browser pod, so EB setup is required even for development.
| Mode | How | When |
|---|---|---|
| Embedded Browser (default) | Browser runs in a container with live streaming back to the UI. Provisioned dynamically into k3d locally, or into your cluster in production. | Default for all dev and prod runs — no local Playwright install needed |
| Remote Runner | Tests dispatched to remote machines via WebSocket | Distributed execution, different OS/browsers, CI/CD |
Both modes support running and recording. Builds can be triggered manually (click Run), by webhook (PR opened/updated), on push to monitored branches via CI/CD (GitHub Action or CLI runner), or on a schedule (cron-based automation). Smart Run analyzes git diffs to run only affected tests.
Tests are recorded or generated once, then stored as code. Every subsequent run re-executes the same code, captures new screenshots, and diffs them against approved baselines.
Create tests (one-time) Run tests (forever)
┌──────────────────────┐ ┌──────────────────────┐
│ Manual recording │ │ Execute Playwright │
│ — or — │ ────▶ │ Capture screenshots │
│ AI generation │ save │ Diff against baseline │
│ — or — │ │ Review changes │
│ Play Agent autonomy │ │ Approve/reject │
└──────────────────────┘ └──────────────────────┘
AI may be used here No AI needed here
expect() calls passed/failed with expected vs actual values, error messages, and code line references.GET /export + POST /import).lastest_api_*) for the MCP server, VS Code extension, CI scripts, and cross-instance migration. Revokable per-user with labels.Date.now() and new Date() with fixed values for deterministic screenshots.Math.random() for consistent outputs.@lastest/mcp-server) exposing 29 tools for AI agent integration: run tests, review diffs, approve baselines, create/heal tests, check coverage. Install via npx @lastest/mcp-server./api/v1/) for IDE integration.window.__APP_STATE__, Redux stores, etc.) for complex assertions.Running tests requires the Embedded Browser stack — there is no local-Playwright fallback. Bring up the database, the host app, and the k3d EB cluster together:
git clone https://github.com/las-team/lastest.git
cd lastest
docker compose up -d # postgres on :5432 (named volume `lastest-pgdata`)
pnpm install
# Configure env (required before pnpm dev — without EB_PROVISIONER the app
# starts but no test can ever provision an Embedded Browser).
cp .env.example .env.local
cat >> .env.local <<EOF
EB_PROVISIONER=kubernetes
EB_NAMESPACE=lastest
EB_IMAGE=lastest-embedded-browser:latest
LASTEST_URL=http://host.k3d.internal:3000
SYSTEM_EB_TOKEN=$(openssl rand -hex 32)
EOF
pnpm db:push # apply schema
pnpm stack # REQUIRED: create k3d cluster + build/import EB image
pnpm dev # http://localhost:3000
Open http://localhost:3000.
docker compose down (data persists in the lastest-pgdata volume).docker compose down -v.The dev app runs on the host while EB pods are dynamically provisioned into a local k3d cluster — one EB per test. Without pnpm stack running, no test can execute or record.
pnpm stack # create k3d cluster, build + import the EB image
pnpm stack:status # cluster + EB jobs + host /api/health
pnpm stack:logs # tail EB pod logs
pnpm stack:refresh # rebuild the EB image after editing packages/embedded-browser
pnpm stack:stop # delete the cluster
The .env.local keys the EB stack requires (already added by the Quick Start block above):
EB_PROVISIONER=kubernetes
EB_NAMESPACE=lastest
EB_IMAGE=lastest-embedded-browser:latest
LASTEST_URL=http://host.k3d.internal:3000
SYSTEM_EB_TOKEN=<openssl rand -hex 32>
DATABASE_URL=postgresql://lastest:lastest@localhost:5432/lastest
Note on defaults:
EB_PROVISIONERdefaults to'none'in code, so omitting it letspnpm devstart cleanly but every test will silently fail to provision an EB. Always set it for any environment that runs tests.
See k8s/ and scripts/k3d-*.sh for the manifests and bootstrap scripts.
k3d ≥ 5.6, kubectl, openssl (the EB stack — no local-Playwright fallback)┌──────────────────┐ ┌─────────────┐ ┌─────────────┐
│ Create Tests │ ──▶ │ Run │ ──▶ │ Review │
│ │ │ │ │ │
│ Record manually │ │ Embedded │ │ Approve/ │
│ AI-assisted │ │ Browser or │ │ Reject │
│ Play Agent auto │ │ remote/CI │ │ changes │
└──────────────────┘ └─────────────┘ └─────────────┘
One-time cost No AI per run New baseline
(AI optional) (pure Playwright) saved
Create: Build tests your way — record manually in the browser, let AI generate from a URL or spec, or let the Play Agent autonomously scan your entire app.
Run: Execute tests in an Embedded Browser pod (default), on remote runners, or in CI/CD. Screenshots are captured at key steps. No AI needed — pure Playwright execution at zero cost. Local Playwright on the host is no longer supported; the EB stack is required.
Compare: New screenshots are diffed against baselines using your chosen engine (pixelmatch, SSIM, or Butteraugli). Text-region-aware comparison available. Accessibility audits run automatically.
Review: Visual diffs are classified (unchanged/flaky/changed). AI can optionally auto-classify with confidence scores. Approve intentional changes — they become the new baseline.
Fix: When tests break, AI can propose fixes (human-in-the-loop) or the Play Agent can fix and re-run autonomously. Or edit the code by hand — your choice.
End-to-end view of how Lastest fits into a CI/CD workflow — from git push through preview-env validation to merge approval.
Distributed test execution via HTTP polling. The Lastest server queues commands; runners (Docker / CI / Cloud VM / local machine) poll for work, execute Playwright tests, capture screenshots, and report results back.
| Capability | Lastest | Percy | Applitools | Chromatic | Argos | Meticulous | Playwright |
|---|---|---|---|---|---|---|---|
| Price | Free self-hosted / hosted plans | Paid | Paid | Paid | Paid | Paid | Free |
| Screenshot volume (self-hosted) | Unlimited | Limited | OSS only | Limited | Limited | None | Unlimited |
| Self-hosted | Yes | No | Enterprise | No | OSS core | No | Yes |
| Open source | FSL-1.1-ALv2 | SDKs only | SDKs only | Storybook | MIT core | No | Apache-2.0 |
| No-code recording | Yes | No | Low-code | No | No | Session | Codegen |
| AI test generation | Yes | No | NLP | No | No | Session-based | No |
| AI auto-fix tests | Yes | No | No | No | No | Auto-maintain | No |
| Autonomous agent | Yes (Play Agent) | No | No | No | No | No | No |
| AI diff analysis | Yes | AI Review Agent | Visual AI | No | No | Deterministic | No |
| Multi-engine diffing | 3 engines | No | Visual AI | No | No | No | No |
| Text-region-aware diffing | Yes | No | No | No | No | No | No |
| Spec-driven test gen | Yes | No | No | No | No | No | No |
| Approval workflow | Yes | Yes | Yes | Yes | Yes | PR-based | No |
| Accessibility | axe-core | No | No | Enterprise | ARIA snaps | No | No |
| Route discovery | Yes | No | No | No | No | No | No |
| Multi-tenancy | Yes | Projects | Enterprise | Projects | Teams | Projects | No |
| Figma integration | Yes | No | Yes | No | No | No | No |
| Google Sheets data | Yes | No | No | No | No | No | No |
| Debug mode | Yes | No | No | No | Traces | No | Trace |
| Remote runners | Yes (npm package) | Cloud | Cloud | Cloud | Cloud | Cloud | No |
| Embedded browser | Yes (container + live stream) | No | No | No | No | No | No |
| Local AI (Ollama) | Yes | No | No | No | No | No | No |
| Cross-OS consistency | 12 stabilization features | No | No | No | Stabilization engine | No | No |
| GitHub Action | Yes | Cloud-only | Cloud-only | Cloud-only | Cloud-only | Cloud-only | No |
| GitLab integration | Yes (self-hosted) | Yes | Yes | No | No | No | No |
| Test composition | Yes | No | No | No | No | No | No |
| Testing templates | 8 presets | No | No | No | No | No | No |
| Setup/teardown orchestration | Yes | No | No | No | No | No | No |
| Branch baseline management | Yes | Yes | Yes | Yes | No | No | No |
| Scheduled test runs | Yes (cron) | Cloud | Cloud | Cloud | Cloud | Cloud | No |
| MCP server (AI agent API) | Yes (29 tools) | No | No | No | No | No | No |
| WCAG compliance scoring | Yes (0–100) | No | No | No | No | No | No |
| AI failure triage | Yes | No | No | No | No | No | No |
| Assertion tracking | Yes | No | No | No | No | No | No |
| Agent monitoring | Yes (real-time SSE) | No | No | No | No | No | No |
| In-app bug reports | Yes (auto-context) | No | No | No | No | No | No |
| Gamification | Yes (leaderboard + achievements) | No | No | No | No | No | No |
| Cross-instance migration | Yes (API export/import) | No | No | No | No | No | No |
| API tokens | Yes (long-lived Bearer) | Cloud | Cloud | Cloud | Cloud | Cloud | No |
@lastest/runner on npm) for distributed/CI runspnpm dev # Start development server on localhost:3000
pnpm build # Production build
pnpm start # Start production server
pnpm lint # Run ESLint
pnpm test # Run unit tests (Vitest)
pnpm test:watch # Run unit tests in watch mode
pnpm test:coverage # Run tests with coverage report
pnpm test:ui # Run tests with Vitest UI
pnpm db:studio # Open Drizzle Studio for database inspection
pnpm db:push # Push schema changes to database
pnpm db:generate # Generate Drizzle migrations
pnpm db:reset # Reset database (drops all tables + removes screenshots/baselines)
pnpm db:seed # Seed test data
pnpm test:visual # Run visual tests via CLI (see below)
# Local k3d cluster — hosts dynamically-provisioned EB Job pods (no app, no db)
pnpm stack # create cluster + build/import EB image
pnpm stack:refresh # rebuild + import EB image (alias of stack:refresh:eb)
pnpm stack:refresh:eb # same
pnpm stack:status # cluster + EB jobs/pods + host /api/health
pnpm stack:logs # tail EB pod logs
pnpm stack:stop # delete cluster
In-depth docs for every integration live on the Lastest Wiki. The README keeps things at a glance — click through for flags, payloads, and CI examples.
| Guide | What it covers | Wiki |
|---|---|---|
| CLI Test Runner (CI/CD) | pnpm test:visual --repo-id <id> for GitHub Actions / other pipelines; auto-captures GITHUB_HEAD_REF / GITHUB_REF_NAME / GITHUB_SHA |
CI/CD Integration |
| GitHub Action | Reusable composite action las-team/lastest/action@main — zero local Playwright, runs on your Lastest server via a remote runner; outputs status + build URL + counts |
CI/CD Integration · GitHub Integration |
| Smart Run | Diff-based test selection — only tests affected by changed files run, comparing the feature branch against the default branch via GitHub/GitLab API | Running Tests |
| Self-Hosted Deployment | pnpm deploy:zima (ZimaBoard / CasaOS via docker compose) and pnpm deploy:olares (Olares via kubectl); shared multi-stage Dockerfile, GET /api/health. Required env: POSTGRES_PASSWORD, BETTER_AUTH_SECRET, SYSTEM_EB_TOKEN |
Docker Deployment |
| Remote Runners | @lastest/runner on npm — register in Settings → Runners, then lastest-runner start -t <token> -s <url>; supports run, record, parallel, daemon mode, system-info reporting |
Remote Runners |
| MCP Server | npx @lastest/mcp-server --url <…> --api-key <…> exposes 29 tools (run/poll/list/heal/approve/reject/coverage/…) for Claude and other agents; structured JSON responses |
MCP Server |
| Scheduled Runs | Cron-based automated builds with presets (daily 3am, weekly, hourly, every 15min) or custom expressions; auto-disable after 5 consecutive failures | Scheduled Runs |
| Google Sheets Integration | Spreadsheet-backed test data — per-team OAuth, multi-tab spreadsheets, custom header row, fixed ranges; surfaces values on the test Vars tab | Google Sheets |
| Custom Webhooks | POST build.completed payloads (status / counts / git refs / build URL) to any HTTP endpoint, with custom method + headers |
Custom Webhooks |
| VSCode Extension | lastest-vscode — Test Explorer in the Activity Bar, run tests from the editor, live status bar, real-time WebSocket updates; powered by /api/v1/ REST + SSE |
VSCode Extension API |
| API Tokens | Long-lived Bearer tokens for programmatic access (CI runners, MCP server, REST clients) | API Tokens |
| Bug Reports | In-app reporting with auto-captured browser/network/console context, optional GitHub-issue creation | Bug Reports |
| Agent Monitoring | Real-time SSE activity feed tracking Play Agent sessions step-by-step | Agent Monitoring |
| Gamification | "Beat the Bot" — scoring, seasons, leaderboards, Bug Blitz multiplier events | Gamification |
| Test Migration | Cross-instance export / import of tests, areas, and configs via REST API or in-app UI | Test Migration |
All configuration lives under a unified Settings page. Per-section deep dives live on the Settings Reference wiki — the table below is the quick map.
| Section | Description | Wiki |
|---|---|---|
| GitHub | Connect account, select repositories, manage PR-comment + issue-creation hooks | GitHub Integration |
| GitLab | Connect account (supports self-hosted instances), MR comments, webhooks | GitLab Integration |
| Google Sheets | Connect Google Drive, manage data sources, surface vars on the test Vars tab | Google Sheets |
| Playwright | Browser type, viewport, headless/shell mode, selector priority, recording engine, animation freezing, screenshot delay, max parallel tests, headed playback for debugging | Settings Reference |
| Stabilization | Network idle, DOM stability, timestamp freezing, random seeding, third-party blocking, font loading, loading-indicator hiding, cross-OS consistency, burst capture, auto-mask dynamic content | Stabilization |
| Environment | Server startup (manual vs auto-start), health check URLs, EB-mode toggles | Environment Vars |
| Diff Sensitivity | Diff engine selection (pixelmatch / SSIM / Butteraugli), text-region-aware diffing, DOM-diff fallback, pixel/percentage thresholds, page-shift detection, per-step ignore regions | Visual Diffing |
| AI | Test-generation provider, diff-analysis provider, API keys, model, custom instructions, Ollama / OpenAI / Claude / OpenRouter support, MCP wiring for "Enhance with AI" | AI Configuration |
| Notifications | Slack, Discord, custom webhook config, auto-create GitHub issue from a visual diff | Custom Webhooks |
| Branches | Baseline and scanning branch selection, branch baseline fork/merge/promote | Visual Diffing |
| AI Logs | Audit trail of all AI requests (last 50 entries) with cost + latency | AI Configuration |
| Testing Templates | One-click preset configurations for SaaS, Marketing, Canvas, E-commerce, Documentation, Mobile-First, SPA, CMS | Testing Templates |
| Setup | Default repository-wide multi-step setup scripts (Playwright and API types), with per-test overrides | Settings Reference |
| Teardown | Default repository-wide multi-step teardown scripts with per-test overrides | Settings Reference |
| Schedules | Cron-based automated test runs with presets and custom expressions | Scheduled Runs |
| Vars | Test-data variables — static, AI-generated (with presets), and Google Sheets-backed | Google Sheets |
| API Tokens | Long-lived Bearer tokens for programmatic + MCP access | API Tokens |
| Account | Email preferences, unsubscribe, GDPR / self-serve account deletion | — |
| Users | Team member management, invitations (admin only) | Getting Started |
| Runners | Remote runner registration and management (admin only) | Remote Runners |
@lastest/mcp-server for AI agent integration# GitHub OAuth (for repository sync + login)
GITHUB_CLIENT_ID=
GITHUB_CLIENT_SECRET=
GITHUB_REDIRECT_URI= # Optional
GITHUB_WEBHOOK_SECRET= # Optional: verify webhook signatures
# GitLab OAuth (supports self-hosted instances)
GITLAB_CLIENT_ID=
GITLAB_CLIENT_SECRET=
GITLAB_REDIRECT_URI= # Optional
GITLAB_INSTANCE_URL= # Default: https://gitlab.com
GITLAB_WEBHOOK_SECRET= # Optional: verify webhook signatures
# Google OAuth (for login)
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
GOOGLE_REDIRECT_URI= # Optional
# Google Sheets OAuth (separate scope from login)
GOOGLE_SHEETS_REDIRECT_URI= # Separate redirect for Sheets OAuth
# Email (optional, for invitations)
RESEND_API_KEY=
EMAIL_FROM=
# Database
DATABASE_URL= # Default: postgresql://lastest:lastest@localhost:5432/lastest
MONITORED_BRANCHES= # Default: main,master,develop
NEXT_PUBLIC_APP_URL= # Your app's public URL
NEXT_PUBLIC_BASE_URL= # Base URL for API calls
@lastest/runner on npm)@lastest/mcp-server — 29 tools for AI agent integration)expect())test_specs + agent_plan replace freeform descriptions)gotoExternal pull requests are not being accepted at this time. For bugs, feature requests, or questions, please open an issue or visit lastest.cloud.
FSL-1.1-ALv2 — see LICENSE
Built for solo founders who ship fast and break things (then fix them before users notice).
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"lastest": {
"command": "npx",
"args": []
}
}
}