Visibility & Maturity platform · WCAG Accessibility · Open source
Visibility and maturity
for frontend testability.
selfcure shows if your application is ready to be automated — and proves it's improving. It reads your React/Vue/Angular/HTML source, scores testability, audits accessibility, and identifies ambiguities that break tools like Cypress, Playwright, and Selenium.
selfcure measures the testability maturity of your frontend and proves it's improving. Correction is commodity — visibility over time is the product. — design principle, since v0.1
Pipeline
How it works
selfcure is the visibility layer of the test loop. It runs before any automation tool and proves your frontend is ready to be tested and accessed.
Agentic discovery and testability score
Automatically discover project structure, framework, and routes. Every component gets a 0–100 score and is audited for WCAG compliance: labels, names, and focus order.
Flag ambiguity nobody else catches
When the best selector for an element also matches a sibling, runtime tests silently bind to the wrong node. selfcure detects it at source level and suggests a dedup-aware data-testid patch.
Ship the fix to the frontend team
Open /lint in the browser, tick the patches you want, click once. selfcure branches, commits, pushes, and opens a Pull Request on GitHub. The frontend team owns the fix — not the QA pipeline.
After the PR lands, Cypress, Playwright, Selenium, TestCafe, WebdriverIO, or your agentic test stack gets stable frontend hooks. selfcure is not the runner — it is the maturity layer that proves the frontend is ready.
SCM integrations
One-click Git connection
Connect your repository in a single click via OAuth — no env vars, no client secrets, no manual app registration. selfcure ships a hosted cloud connector so end users authorize and selfcure opens the PR.
GitHub Live
One-click OAuth via the selfcure cloud connector. Authorize, pick fixes in /lint, get a Pull Request. Disconnect revokes the token remotely.
GitLab coming soon
Same flow, same connector — OAuth app pending. Self-hosted GitLab will be supported via per-instance config.
Bitbucket coming soon
Workspace-level OAuth, same one-click flow. Bring Your Own OAuth App is also supported today via local env vars if you want full control.
Prefer no third party? Set GITHUB_OAUTH_CLIENT_ID / SECRET in your project .env and selfcure uses your own OAuth app. The managed connector is opt-in via SELFCURE_CONNECTOR_BASE_URL.
Capabilities
What you get
Ambiguity detection unique to selfcure
When the best selector for a button also matches one of its siblings, automation silently binds to the wrong node. selfcure catches this at the AST level — the failure mode runtime healers can’t prevent.
Testability score
Every interactive element gets a 0–100 score based on a ranked selector list: data-testid → id → aria-label → name → CSS → XPath. Low score = the FE owes a data-testid.
One-click PR selfcure web
Open /lint, tick the patches you want, click once. selfcure branches, commits, pushes, and opens a PR on GitHub. The frontend team reviews and ships.
MCP server @selfcure/mcp
Publishes the crawl + score + ambiguity findings over the Model Context Protocol. Any MCP client — VS Code + GitHub Copilot, Claude Desktop, Cursor, Windsurf, Claude Code — can query them.
WCAG Accessibility new
Static analysis for 10+ WCAG rules: missing labels, accessible names, heading order, and image alt text. CI-ready with configurable severity gates.
Tool-agnostic maturity
Cypress, Playwright, Selenium, TestCafe, WebdriverIO, and AI test agents all benefit from the same thing: stable selectors, governed tags, and a frontend whose testability is measured over time.
Legacy BYOK pipeline fallback
Not on Playwright Test Agents yet? selfcure run still generates + executes + heals tests using the LLM provider of your choice. Available, not the headline.
SonarQube export generic format
Export testability and a11y findings as a SonarQube Generic Issue Import file — no Java plugin, no build pipeline change. Surfaces ambiguity in the dashboard your architect already uses.
No API key needed free
On a corporate Copilot or Cursor seat with no API key? selfcure never asks for one. Hit Copy prompt to IDE (or selfcure lint --prompt) and paste the ready-made fix prompt into the agent you already run — it has the key, selfcure doesn't need it.
Maturity over time unique to selfcure
Every scan records a snapshot, so the /evolution screen charts your testability score and governed-tag count over time — proof to a tech lead that the frontend is getting more testable, not just a number for today. Local and free.
Governance modules
Visibility your team can keep
The product is not a one-off code fix. selfcure maintains the testability argument: what exists, what is ambiguous, what regressed, and what changed after each PR.
Agentic Discovery live
selfcure discover maps framework, structure, source roots, and candidate routes so init starts from evidence instead of guesses.
Tag Maturity Level
selfcure tml report explains which tags are stable, risky, or blocking automation, with HTML and JSON outputs for teams and CI.
Test ID Inventory
selfcure testids scan turns data-testid into a governed contract instead of scattered strings that drift across the app.
Accessibility gates
selfcure a11y audit keeps WCAG findings in the same quality conversation as selector maturity, with severity gates for CI.
Legacy BYOK fallback
Bring your own LLM key
If you haven’t moved to Playwright Test Agents yet, selfcure run still generates + executes + heals tests using the LLM of your choice. Swap providers in one config line — defaults below come from PROVIDERS in packages/generator/src/ai.ts.
| Provider | Default generation | Default healing | Env var |
|---|---|---|---|
| Anthropic | claude-opus-4-7 |
claude-haiku-4-5 |
ANTHROPIC_API_KEY |
| OpenAI | gpt-4.1 |
gpt-4o-mini |
OPENAI_API_KEY |
| Google Gemini free tier | gemini-2.0-flash-exp |
gemini-2.0-flash-exp |
GOOGLE_GENERATIVE_AI_API_KEY |
| Groq free tier | llama-3.3-70b-versatile |
llama-3.1-8b-instant |
GROQ_API_KEY |
| DeepSeek | deepseek-chat |
deepseek-chat |
DEEPSEEK_API_KEY |
| Ollama local · no key | qwen2.5-coder:14b |
qwen2.5-coder:7b |
— |
Get going
Quick start
Five steps from zero to a PR full of data-testid patches.
1 · Install the CLI
# Requires Node 20+
npm install -g @selfcure/cli
→ npmjs.com/package/@selfcure/cli
2 · Lint your frontend
# From your frontend project's root
cd ~/path/to/your-app
selfcure init # scaffold selfcure.config.mjs
selfcure lint # score + flag ambiguous locators
3 · Connect GitHub and ship a PR
selfcure web # opens http://localhost:3333
# → /integrations : one-click GitHub OAuth (no env vars)
# → /lint : tick the fixes you want, click once
# selfcure branches, commits, pushes, opens PR
No client secrets to manage. The selfcure cloud connector handles the OAuth dance; your project only stores the user’s access token locally in .selfcure/integrations.json (auto-gitignored). Disconnect revokes the token remotely.
4 · Add governance reports
selfcure discover
selfcure testids scan
selfcure tml report
selfcure a11y audit
5 · MCP Server
# Connect findings to your AI workflow
selfcure mcp
Connect to VS Code + GitHub Copilot, Claude Desktop, Cursor, or Windsurf to query testability and accessibility findings directly in your AI workflow.
Tool-agnostic
Works with your automation tool
selfcure measures and improves the frontend, not your test framework. Whatever you run, your selectors get stable hooks to target:
Status
Where it stands
selfcure is at v0.1.0. The maturity platform — crawl, score, discovery,
TML, testid inventory, a11y module, ambiguity detection, /lint page,
one-click GitHub PR, MCP server, SonarQube export, and tool-specific landing pages — is
wired end-to-end and dogfooded on a real legacy HTML app
(500 issues across 27 files — 477 of them ambiguous, avg score 43/100).
GitLab and Bitbucket OAuth are next.
Best place to follow progress, file issues, or contribute is the GitHub repo. Stars help; PRs help more.