selfcure

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.

01 · DISCOVER & SCORE

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.

02 · LINT

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.

03 · PR

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-testididaria-labelname → 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.

Read the full getting-started guide →

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.