Aztrx AI

Autonomous runtime stress-testing · a swarm of agents

Your error boundary is hiding a crash.

Aztrx drives your app like a hostile user, proves every crash with a test — and a thousand-agent swarm audits the business logic you're afraid of, patch included.

$npx aztrx-cli

No config. No account. --fix works free for common crashes.

The magic

One command. Find, explain, fix.

Aztrx AI doesn't read logs — it drives your app like a hostile user, catches what your error boundary swallows, proves it, explains it in plain language, and fixes it.

Chaos Fuzzing

--fuzz swaps the deterministic walk for seeded chaos — clicks, types garbage, and races async UI, steering toward code it hasn't reached yet.

ddmin algorithm

Shrinks a 50-step chaos trace down to the single step that actually breaks.

Auto-Repro

--repro shrinks the trace, compiles it into a Playwright .spec.ts, and labels the flake rate — deterministic 3/3, flaky, or unreliable.

Self-Healing

Fixes common crashes for free — a built-in rule patches null/undefined derefs with no key. Complex bugs hand off to your own LLM, gated and replayed in a sandbox before you ever see a line of it.

Human-Language Report

--explain turns a run into a plain-language summary — what broke, where, and whether a fix is ready. No stack-trace archaeology.

One-Click Apply

--fix finds, proves, and fixes — free for common crashes, or via your own model. git diff shows the result. No commit.

The Swarm

--swarm scouts your app, synthesizes the audience it actually has — rushed buyers, night-shift operators, coupon hunters — and swarms it with a thousand weighted agents.

Audit what you fear

--intent "проверь безопасность оплаты" picks the agents that answer the fear. Proof or silence: only exploits that worked end to end are reported, in business language, with a patch.

Prove-It-Fixed

Every verified patch ships a regression test: the repro rewritten with inverted assertions — the attack must now be blocked. It lands in __aztrx_tests__/, passes on the patched code, fails on the unpatched. The bug stays dead.

Where it runs

It comes to you.

Not another dashboard to check. Aztrx wires into the editor, the push, and the dev server you already use — and stays silent until it has something worth saying.

Your editor's agent

An agent can write code but cannot run it — so it calls a change working when all it knows is that the change parsed. Aztrx supplies the missing step: it drives the app in a real browser and hands back the crashes it produced, repro attached.

npx aztrx-cli mcp install

Every git push

Scan the app before the push lands, and block on a crash. It scans your app rather than your diff — a crash three files from the change is exactly the one a diff-shaped scan walks past.

npx aztrx-cli hook install

Your dev server

Three lines of config and crashes surface while you work — no second terminal, no command to remember. The scan runs as its own process, so it can never take your dev server down with it.

plugins: [aztrx()]

MCP · Claude Code · Cursor · VS Code

Put the swarm inside your agent.

The same install gives your editor the whole swarm, not just a scan — audit, repro, and fix arrive alongside it as four tools the agent can call on its own.

npx aztrx-cli mcp install→writes the server into your editor's config; restart the editor, then ask it to run aztrx_audit, and it answers.
aztrx_audit

Tell it what you fear — "проверь безопасность оплаты" — and it picks the agents, exploits the app, and answers in business language with proof and a patch.

aztrx_scan

Drives the app in a real browser and reports the crashes it produced, source locations attached. Boots the dev server itself if none is running.

aztrx_repro

The minimized steps and the compiled Playwright spec for one finding — deterministic, flaky, or unreliable, said honestly.

aztrx_fix

Patch → verify in a git worktree by replaying the repro → optionally write it into your tree. Only a verified patch is ever applied.

Free, local, no account. Findings leave your machine only if you say so.

The proof

From crash to fix, in one run.

On the left, the crash your error boundary swallowed. On the right, the gated patch — replayed and type-checked before it reaches you.

crash — capturedpatch — [tsc: PASS]
TypeError: Cannot read properties of undefined (reading 'items')
at Checkout.renderTotal (checkout.ts:41:9)
at Checkout.render (checkout.ts:28:12)
 
39 │ items.forEach(it => addToCart(it))
40 │ renderTotal()
> 41 │ throw new TypeError('Cannot read properties of undefined')
 
1 crash · shrunk 50 → 1 step · repro: checkout.spec.ts
checkout.ts — self-healing patch
@@ -38,6 +38,7 @@
renderTotal()
 
- items.forEach(it => addToCart(it))
+ const items = this.props.items ?? [];
+ items.forEach(it => addToCart(it))
renderTotal()
 
✓ tsc: PASS
✓ replay: deterministic (3/3 reproductions)
✓ patch → .aztrx/heal/<id>.patch

Measured, not claimed

Scored against apps with known bugs.

Two corpora, every case seeded with exactly one runtime bug, each scored against a manifest that declares what should — and should not — be found. Both run from this repo.

13 Next.js 16 apps

App Router · Turbopack · client components

Detection100% · 13 / 13
Deterministic repro12 / 12

13 vanilla archetypes

framework-agnostic baseline

Detection100% · 13 / 13
Deterministic repro11 / 12

13-swallowed-boundary — the case this exists for

A crash an Error Boundary caught and only logged, never rethrown. A pageerror-only detector scores 0/1 on it. It sits in the corpus precisely so that a regression fails the benchmark.

Reproduce it: npm run bench · cd bench/frameworks && npm run bench

Enterprise & trust

Built for teams that can't leak code.

100% Local Execution

Runs inside your repo, against your code. Nothing leaves your machine unless you explicitly opt in.

Bring Your Own Model

Point healing at any model — Anthropic, OpenAI, Grok, DeepSeek, Gemini, Kimi, OpenRouter, Ollama, or any OpenAI-compatible endpoint. Or run fully offline and never call an LLM.

CI/CD Native

A GitHub Action gates every PR. Fail the build when a crash is proven, not guessed at.