A synthetic user-testing / product auditor that drives a real browser, explores your web app like a user, and scores it against rubrics. Every take the agent has ties back to a screenshot, so you can see what UX is causing what reaction.
Tardigrade uses a fast multimodal LLM to drive a real browser, explore web apps, and score them against built-in and custom rubrics. Point it at any OpenAI-compatible endpoint (OpenAI, Gemini, DeepSeek, Kimi, Cerebras, or a local server).
Built during a hackathon hosted by Cerebras and the Google DeepMind Gemma team. Thanks to both for the compute and the models.
A live audit in progress. The agent explores the page and narrates its reasoning step by step.
Persona-driven exploration with click targets and per-step notes. |
Home dashboard: run history and system status at a glance. |
- You give Tardigrade a URL (a production site or something running on
localhost). - It launches a real browser via Playwright and explores the app like a synthetic user.
- It captures screenshots, DOM snapshots, console logs, and network errors for every step.
- It scores the session against UX, functional, conversion, and custom rubrics.
- It shows the results in an interactive dashboard: replay the session, inspect evidence, and review findings.
Most AI QA tools are either:
- Closed SaaS black boxes that are easy to start but hard to customize.
- Raw agent libraries that can browse but leave you to build rubrics, evidence collection, reporting, and replay UI.
Tardigrade is opinionated about rubrics and evidence. The goal is to make synthetic user testing repeatable, shareable, and grounded in observable proof.
| Layer | Choice | Reason |
|---|---|---|
| UI | Electron + React + TypeScript | Cross-platform desktop app; can reach localhost targets cleanly |
| Backend runtime | Node.js / TypeScript | Same runtime as Electron; native Playwright and OpenAI-SDK support |
| Browser automation | Playwright | Multi-browser support, screenshots, traces, network, console |
| LLM | Any OpenAI-compatible endpoint | Bring your own provider/key; presets for OpenAI, Gemini, DeepSeek, Kimi, Cerebras |
| Database | SQLite | Zero infrastructure; local-first |
| Packaging | Electron-embedded backend | No Docker required for normal use |
This is an early MVP. Implemented so far:
- ✅ Electron + Node.js backend scaffold
- ✅ SQLite schema for runs, sessions, and findings
- ✅ Health and Playwright status endpoints
- ✅ Agent loop: screenshot + DOM snapshot → LLM JSON action → execute
- ✅ Built-in rubrics and evaluator
- ✅ Custom rubric prompt → JSON generation
- ✅ Session replay screenshot carousel
- ✅ Finding cards with evidence
- ✅ Settings screen (provider preset, base URL, API key, model, image usage, browser)
- ✅ Cost/usage tracking (tokens, LLM calls)
- ✅ Mock LLM mode for offline testing
- ✅ Example CLI script
- 📋 A polished end-of-run report. Today you get finding cards and a session replay, but no single summary. The plan is one shareable report per run: overall scores by rubric category, a severity breakdown, the top findings with linked evidence, and export to Markdown or PDF.
See:
- ARCHITECTURE.md — design decisions and intentions
- ROADMAP.md — milestones and future phases
- TESTING.md — how to develop and verify
- PROMPTS.md — LLM prompts and iteration notes
- TROUBLESHOOTING.md — common issues and fixes
- Node.js 20+
- An API key for any OpenAI-compatible LLM provider (for live runs)
- Playwright browsers:
npx playwright install chromium
npm installTardigrade talks to any OpenAI-compatible Chat Completions endpoint, so you
can bring your own provider and key. Copy .env.example to .env:
cp .env.example .envEdit .env:
LLM_API_KEY=your-key-here
LLM_BASE_URL=https://api.openai.com/v1
LLM_MODEL=gpt-4oBuilt-in provider presets (selectable in the Settings screen, all editable):
| Provider | Base URL | Example model | Vision |
|---|---|---|---|
| OpenAI | https://api.openai.com/v1 |
gpt-4o |
✅ |
| Google Gemini | https://generativelanguage.googleapis.com/v1beta/openai |
gemini-2.5-flash |
✅ |
| Cerebras | https://api.cerebras.ai/v1 |
gemma-4-31b |
✅ |
| DeepSeek | https://api.deepseek.com/v1 |
deepseek-chat |
|
| Kimi (Moonshot) | https://api.moonshot.ai/v1 |
kimi-k2.7 |
|
| Custom / local | e.g. http://localhost:11434/v1 |
your model | depends |
Vision matters. Tardigrade drives the agent from screenshots, so the model must be multimodal. OpenAI
gpt-4oand Gemini flash models read images; DeepSeek's and Kimi's standard chat models are text-only and will fail on screenshots. Use a vision-capable model for real audits.
The base URL must include the version path (e.g.
/v1); the OpenAI client does not append it. A bare host such ashttps://api.deepseek.comis auto-upgraded to/v1for convenience.
Vision tokens dominate the cost of a run. The Image usage setting (Settings
screen, or LLM_IMAGE_MODE in .env) controls how many screenshots are sent to
the model:
| Mode | What it sends | Cost |
|---|---|---|
high (default) |
Full-detail screenshot every step | Highest, best accuracy |
balanced |
Low-detail screenshot every step | Cheaper, one image per action |
minimal |
Low-detail, only on the first step and after the page changes | Lowest |
This only affects images sent to the model; the per-second replay frames saved to disk are unaffected.
Legacy CEREBRAS_API_KEY / CEREBRAS_BASE_URL / CEREBRAS_MODEL variables are
still honored as a fallback, so existing setups keep working without changes.
If port 3001 is already in use, set a different BACKEND_PORT.
You can also set the provider, base URL, key, and model in the app's
Settings screen; they are stored in ~/.tardigrade/config.json.
npm run devThis starts the Vite dev server and opens the Electron window. The Electron main process also spawns the backend automatically.
Set MOCK_LLM=true to run the pipeline with deterministic placeholder actions and findings:
MOCK_LLM=true npm run devcd packages/backend
MOCK_LLM=true npm run example http://localhost:8000/sample.html defaulttardigrade/
├── packages/
│ ├── backend/ # Express server, agent loop, evaluator, DB, rubrics
│ └── frontend/ # Electron + Vite + React UI
├── README.md
├── ARCHITECTURE.md
├── ROADMAP.md
├── TESTING.md
├── PROMPTS.md
├── TROUBLESHOOTING.md
Contributions are welcome — see CONTRIBUTING.md for setup, dev, and the checks CI runs.
MIT © noemit



