TanCat logo
TanCat tancat-0.1.0
BYO-LLM · BOUNDED EGRESS · AIR-GAP READY

The AI test generator where your data never leaves your deployment.

Paste a user story generate executable Playwright pytest tests from your own LLM, on your own infra. It even learns from your reference docs — and they stay in-house.

TanCat — Product UI
Real TanCat Streamlit App UI: AI Playwright Test Generator with target URL, parse mode, URL guard, max pages, and site health check.
Streamlit Web UIReal product capture - launch_ui.sh output
No telemetry · 100% private
$git clone https://github.com/tancat-ai/tancat && cd tancat && uv sync && bash launch_ui.sh
How It Works

Story → Generate → Run → Evidence → Export

One seamless loop that completes end-to-end, with locators taken from the real rendered DOM — not guessed.

1

Paste a User Story

Plain language Jira ticket, user acceptance criteria, or markdown spec. That's the only input — no syntax to learn or test framework to master. Or upload a spec doc — the LLM learns from it, and it stays in-house.

“As an admin, clicking 'Revoke Token' opens confirm modal.”
2

Generate against the live DOM

TanCat launches headless Chromium, inspects real DOM nodes, builds a page skeleton, and feeds exact attributes to your offline LLM. Score-gated resolution - no hallucinated IDs.

Resolved: button[data-testid="revoke-access-confirm"]
3

Run, Evidence, Export

TanCat executes the generated test, records screenshots, and writes out evidence in the shape each role needs: a suite heatmap for the product owner, a Gantt timeline for the test manager, and JUnit/HTML/CSV for the rest.

PASSED 1/1 (0.84s)test_report.html
Live DOM Resolution Engine

See how plain English becomes ground-truth Pytest.

Locators aren't guessed. TanCat scrapes the live DOM and resolves against real attributes — with score-gated confidence — before it prompts, so every selector traces back to the rendered page.

Session: #TAN-8921
DOM Synthesized[Interactive Demo - Example BYO Model: Llama-3-70B-Q4 / Ollama / llama.cpp]
1. Input User StoryJira Acceptance

# Feature: High-Value Wire Confirmation

1. Navigate to /transfers/wire
2. Input amount: “50000”
3. Select beneficiary: “Escrow Alpha”
4. Click “Submit Wire”
5. Verify 2FA modal with ID #two-factor-dialog

Auto-Extracted Intent:
✓ form_fill(amount, beneficiary)
✓ action_click(submit_button)
✓ assert_visible(modal_overlay)
2. Live Scraped DOM TreeChromium v126
<form id="wire-transfer-form" data-state="ready">
<input name=“transfer_amt” data-testid=“wire-amount-input” />
↳ Resolved: [data-testid="wire-amount-input"] (Score: 0.99)
<button type=“button” id=“submit-wire-btn” > Submit Wire </button>
↳ Resolved: #submit-wire-btn (Unique XPath, Safe)
</form>
<dialog id="two-factor-dialog" class="modal-open">...</dialog>
Ground-truth resolution:Deterministic (score-gated)
3. Playwright PytestPASSED
test_wire.pyjunit.xmlreport.html
import pytest
from playwright.sync_api import Page, expect

@pytest.mark.egress_gated
def test_wire_confirmation_modal(page: Page):
    page.goto("/transfers/wire")
    page.locator('[data-testid="wire-amount-input"]').fill("50000")
    page.locator('select[name="beneficiary"]').select_option("escrow_alpha")
    page.locator('#submit-wire-btn').click()
    modal = page.locator('dialog#two-factor-dialog')
    expect(modal).to_be_visible()
    expect(modal).to_contain_text("Confirm Authorization")
Execution completed in 0.62sEvidence saved: ./evidence/wire_01.tar.gz
Security & Architecture

Built for the regulated buyer.

Every incumbent cloud SaaS routes your app's DOM through multi-tenant external servers. TanCat deploys on your infra, pointed at your local LLM, keeping sensitive customer data isolated.

🦒

BYO-LLM Architecture

Native compatibility with llama.cpp, Ollama, LM Studio, or an in-cluster private vLLM endpoint. Swap models anytime with zero vendor lock-in.

ENV: TANCAT_LLM_URL=http://127.0.0.1:8080/v1
🛡

Bounded Egress (Verified in CI)

Runtime outbound calls strictly limited to your local/self-hosted LLM endpoint and your target application. Verified by static code inspection in CI via python scripts/audit_egress.py (AST call-site static inspection) wired into smoke tests and CI.

Audit Gate: PASSING
🪁

Self-Healing Locators

When design teams alter markup or CSS class names, TanCat calculates semantic affinity to reconcile and heal broken locators in staging before CI turns red.

Self-healing locators that dynamically recover from UI refactors and markup drift without test rot.
📊

Audit-Grade Evidence Bundles

Real evidence, not just a vague checkmark. HTML, CSV, NDJSON, and JUnit XML test reports with deterministic DOM execution bundles.

HTML ReportsCSV LogsNDJSONJUnit XML

Native CI/CD Action & POM Mode

Organizes test code into maintainable Page-Object-Model (POM) python classes automatically. Drop our reusable GitHub Action or GitLab Runner into your existing pipelines in minutes.

GitHub ActionsGitLab CIPOM Pattern
Egress Audit Verified (Automated CI Gate)

The runtime makes outbound calls only to your LLM endpoint and your own target site.

No PyPI background calls at runtime. No tracking beacons. No model weights downloaded at runtime. Enforced via python scripts/audit_egress.py AST static inspection in CI. The LLM traffic is constrained to your trusted endpoint and target traffic is strictly SSRF-guarded.

BOUNDED EGRESS TOPOLOGYISOLATED
TanCat Engine (Your Host)
↕ AST audited / localhost / private IP
IN-PERIMETERLocal LLM
IN-PERIMETERTarget App DOM
Product runtime egress: LLM + target only
Predictable Model

Per deployment, not per seat.

Deploy it once per company, per infra. You should never be penalized when your entire QA and dev squad writes reliable tests.

Developer / OSS

Free Community

For solo developers, or for local debugging.

Anchor: Mabl 500-credit trial; testRigor free trial

$0 / forever
  • 25 runs / 10 exports per 30 days
  • BYO-LLM, bounded egress
  • HTML / CSV / NDJSON evidence
  • Playwright Pytest test generator
Most Popular
Engineering Team

Pro Deployment

Unlimited internal runs across your sprint teams and staging CI pipelines.

Anchor: testRigor $450/mo Pro; Mabl $499/mo

~$299-499 / deployment
  • Unlimited team test runs
  • POM mode & multi-site suites
  • CI/CD Action (GitHub/GitLab)
  • Self-healing + RAG DOM memory
  • Priority security patch queue
Regulated Enterprise

Air-Gap / Defense

For banking, healthcare, aerospace, and government zero-trust environments.

Anchor: Mabl Private ~$900/mo; QA Wolf $8k/mo+, $90k median ACV

~$1-3k / deployment
  • Strict private-network / air-gap license
  • Contractual egress-limitation SLA
  • Custom auditor evidence reporting
  • Dedicated engineer onboarding & SLA
* Per-deployment pricing benchmarked against public vendor tiers (testRigor, Mabl, QA Wolf) in RESEARCH_COMPETITIVE_LANDSCAPE.md §4.2. The differentiated revenue is the air-gap premium tier. Contact sales for multi-cluster enterprise licensing.
Fast Setup

Clone + uv sync + run

TanCat uses uv for fast, reproducible dependencies.

# Terminal (macOS / Linux / WSL2)bash
# 1. Prerequisites: Python 3.14+, uv, local LLM server
# (llama.cpp @ localhost:8080, Ollama, or LM Studio)
# 2. Clone and prepare dependencies
$ git clone https://github.com/tancat-ai/tancat
$ cd tancat
$ uv sync
$ playwright install chromium
# 3. Launch the visual mission control
$ bash launch_ui.sh
# (or headless CLI: bash launch_cli.sh)

What you need

  • Python 3.14+ runtime with uv
  • Local OpenAI-compatible API endpoint (llama.cpp, Ollama, or LM Studio)
  • Chromium browser binary (installed by playwright)
  • Target staging URL or localhost dev server
Get Started

Contact us

Tell us about your deployment — your stack, your LLM, your environment (air-gapped or not). We’ll set you up with a license and point you to the right tier.

Email us
hello@tancat.dev

We’ll get back to you within 2 business days. Per-deployment pricing · no per-seat charges.