Point Kery at your web app, pick an LLM provider, and let it loose. It drives a real browser through your flows, grades every claim about the change — verified or contradicted — and backs each verdict with an annotated screenshot: the proving element boxed, the expected-vs-observed caption burned in. Bugs come with the same evidence. No selectors to write. No scripts to maintain, no "trust me" test output.
Real output from a single run: Kery read the PR, generated these checks itself, drove the preview, and rendered the evidence.
Quick Start
The fastest path: one command sets up everything.
npx keryai
The CLI wizard asks for your LLM provider and API key, generates a docker-compose.yml, and starts all services. Dashboard opens at http://localhost:11111.
Manual Docker setup:
cp .env.example .env
# Add at least one LLM key — see Configuration below
docker compose up -d
Local development (no Docker):
# Requires Node 20+, PostgreSQL 16+, Redis
npm install
DATABASE_URL=postgresql://kery:kery@localhost:11112/kery npm run migrate
npm run dev:api # API + Dashboard → http://localhost:11111
How It Works
1. Scan — Kery BFS-crawls your app and builds a map of every route, form, modal, and interaction.
2. Plan — For each route or saved test intent, a path-planning agent generates a sequence of steps to exercise that flow.
3. Run — A Navigator agent drives a real Playwright browser, observing the page via accessibility tree and screenshots. A Review Agent and Filmstrip Reviewer run in parallel, watching for visual and UX regressions.
4. Verify — A Verification Agent grades every claim against the recorded trace: verified needs an observed effect (navigator say-so doesn't count), contradicted needs the failure on screen. A vision pass localizes the proving element, and each verdict is rendered as evidence — zoomed crop, bounding box, expected-vs-observed caption.
5. Report — A Triage Agent deduplicates findings, filters false positives using memory from past runs, and outputs bugs categorized by type (visual / functional / UX) and severity — each with the same annotated-screenshot treatment.
Features
Verified Evidence
- Every run grades its checks: verified / contradicted / not testable — with the reasoning
- Annotated screenshot per verdict: the proving element localized and boxed, caption bar with expected vs. observed
- Zoom crops keep small targets (a button, a price) legible; captures run at 2x scale for retina-sharp evidence
- Full-run video recording, scoped clips per finding
App Discovery
- BFS crawler maps all routes, links, forms, and modals
- Route health dashboard — clean / issues / stale / untested
- Depth and scope controls per project
Autonomous Testing
- Intent-driven tests: describe what to test in plain English
- Supports authenticated flows — form login, Clerk, Supabase, OAuth, API tokens
- Navigator agent uses accessibility tree + screenshots, not brittle CSS selectors
- Stagehand self-healing: when the DOM shifts, elements are found by intent
Bug Detection
- Visual bugs — layout breaks, rendering glitches, pixel regressions
- Functional bugs — broken flows, unexpected errors, failed assertions
- UX bugs — confusing copy, missing feedback, accessibility gaps
- Screenshot per bug with highlighted bounding box; URL, severity, and source agent
Agent Memory
- Learns successful navigation paths across runs
- Records known false positives, ignore regions, and bug patterns
- Confidence scoring with decay — memory stays fresh, not compounding
Integrations
- MCP server: run tests and triage bugs from Claude Code, Cursor, or any MCP-compatible IDE
- TypeScript client SDK for CI/CD and custom orchestration
- REST API + SSE streaming for real-time run progress
LLM Flexibility
- Anthropic (recommended default), OpenRouter, OpenAI, Google Gemini
- Each agent role (Navigator, Review, Auxiliary, Stagehand) configurable independently
- Per-run token and cost tracking
MCP — Run Kery from Your IDE
Connect your editor and run tests without leaving it. Which server you want depends on where Kery runs.
Kery Cloud (hosted) — remote MCP
Nothing to install. One command, browser auth, no API keys to paste:
claude mcp add --transport http kery https://api.kery.dev/mcp
For mcp.json clients (Cursor, Windsurf, and friends):
{
"mcpServers": {
"kery": { "url": "https://api.kery.dev/mcp" }
}
}
Your client registers itself over OAuth and gets its own scoped token, which you can revoke any time from Settings.
Self-hosted OSS — stdio MCP
Running Kery yourself with Docker? Use the @keryai/mcp package. The setup
wizard writes the config for you:
npx keryai # select "Install MCP" during setup
Or add it manually to your MCP config:
{
"mcpServers": {
"kery": {
"command": "npx",
"args": ["-y", "@keryai/mcp"],
"env": {
"KERY_API_URL": "http://localhost:11111",
"KERY_WEB_URL": "http://localhost:11111"
}
}
}
}
Once connected, your AI assistant can scan your app, run tests, and triage bugs inline — no context switching.
Available tools: kery_scan, kery_run_test, kery_get_bugs, kery_update_bug, kery_list_routes, kery_memory, kery_get_coverage, and 20+ more.
Configuration
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
postgresql://kery:kery@localhost:11112/kery |
PostgreSQL connection string |
OPENROUTER_API_KEY |
— | OpenRouter key (routes to all models — recommended) |
OPENAI_API_KEY |
— | Direct OpenAI key |
ANTHROPIC_API_KEY |
— | Direct Anthropic key |
GEMINI_API_KEY |
— | Direct Google Gemini key |
CUSTOM_LLM_BASE_URL |
— | Any OpenAI-compatible endpoint (Azure, DashScope, Ollama, LiteLLM…). Use model ids prefixed custom/, e.g. AGENT_MODEL=custom/qwen3-coder-plus |
CUSTOM_LLM_API_KEY |
— | API key for the custom endpoint (optional — local endpoints often need none) |
AGENT_MODEL |
anthropic/claude-sonnet-5 |
Model for browser navigation decisions |
AUXILIARY_MODEL |
anthropic/claude-haiku-4.5 |
Crawl, path planning, memory curation, summarization |
REVIEW_AGENT_MODEL |
anthropic/claude-sonnet-5 |
Post-run holistic and filmstrip screenshot analysis |
STAGEHAND_ENABLED |
true |
Enable Stagehand for semantic element finding |
STAGEHAND_MODEL |
anthropic/claude-haiku-4.5 |
Model for Stagehand element finding |
RUN_TIMEOUT_MINUTES |
15 |
Max wall-clock time per test run |
All model settings are also configurable via the dashboard under Settings.
Architecture
packages/
engine/ — Core agent loop, LLM client, crawler, memory, bug triage
db/ — PostgreSQL storage adapter (StorageAdapter interface)
kery/ — CLI setup wizard (npx keryai)
mcp/ — Model Context Protocol server (@keryai/mcp)
client/ — TypeScript HTTP client SDK (@keryai/client)
apps/
api/ — Fastify HTTP server
web/ — React dashboard
worker/ — Test run executor (BullMQ)
The engine is storage-agnostic via the StorageAdapter interface — PostgreSQL is the default, but other backends can be plugged in.
Contributing
Issues and pull requests are welcome. Please open an issue to discuss large changes before starting work.
git clone https://github.com/keryai/kery
cd kery
npm install
cp .env.example .env
docker compose up postgres redis -d
npm run dev
License
Apache 2.0 — see LICENSE.
No comments yet
Be the first to share your take.