A pentest takes six weeks to book and a scanner hands you two hundred maybes. Strix runs a team of agents in a Docker sandbox with a real attacker's toolkit: a proxy, a browser, a shell and a Python runtime for writing exploits. Every finding arrives with a working proof, so there is nothing to triage. Free, and only on what you own.
By Raj Singh · September 2026 · 65k stars · one command to install · 7 min read
The tree on the left is the agent team splitting the job between them. The panel on the right is the traffic they are sending right now. Findings land at the bottom as they are proved, not as they are suspected.

Only what you own. The project's own warning, and it is the law: run this against systems you own or hold explicit written permission to test, inside the agreed scope. Unauthorised testing is a crime in most places, and pointing an agent at a stranger's site is exactly that.
Set a budget or regret it. There is no spend cap unless you pass --max-budget. The default scan is deep, reasoning effort defaults to high, each agent gets 500 turns, and agents spawn more agents. My first unattended run is always capped, and so should yours be.
Proof, not a maybe list. It writes and runs an exploit for each issue it claims, so what lands in the report has already worked. That is the difference from a scanner: nobody spends the next day deciding which of two hundred findings are real.
Telemetry ships on. STRIX_TELEMETRY defaults to 1 and covers PostHog, Scarf and OpenTelemetry. Set it to 0 to turn all three off. Run data is written locally either way, to strix_runs/<name>/events.jsonl.
It fits in a pull request. A quick scan in GitHub Actions scopes itself to changed files and exits non-zero when it finds something. That is the version most teams keep, rather than the six-week engagement.
Drop your email and the rest opens: the install, the model and budget I run, the three scan modes and when each fits, the CI job that scopes itself to a pull request, and the two ways it goes wrong.
One email. No follow-up unless I ship something that fits.
The installer puts the CLI on your path. Configuration is two environment variables, and Strix remembers them in ~/.strix/cli-config.json so you set them once. Start on a local folder rather than a live URL: the feedback is faster and the blast radius is nothing.
The install
Every run writes to disk as it goes. strix view opens the last one in a local dashboard, bound to 127.0.0.1, with the agent map and the findings. Nothing leaves your machine.
Configuration is environment variables, or the same keys in a JSON config file you can commit without secrets. The budget flag is the one I never omit, because an uncapped deep scan with sub-agents is an open tab at your model provider.
| Setting | Default | Why I change it |
|---|---|---|
| --max-budget | none, uncapped | The single most important flag. In headless mode it stops the scan cleanly at the cap and still writes the report, with sub-agents halted at 90 percent so the root can finish. Interactive mode pauses instead, and any message resumes with the cap extended. |
| --scan-mode | deep | Deep is right when you are sitting there watching. Quick is right in CI, where it scopes itself to the files a pull request changed and reasoning effort drops to medium on its own. |
| STRIX_TELEMETRY | 1 | PostHog, Scarf and OpenTelemetry are on out of the box. On client code that is a conversation you do not want to have later. Local run logs are unaffected. |
| STRIX_DEDUPE_MODEL | falls back to STRIX_LLM | Deciding whether a finding duplicates another is a cheap classification job. Point it at a small model and the main one stays on the actual testing. |
| --max-turns | 500 | Per agent, not per run. Fine on a real assessment, generous for a smoke test. Lower it with the budget when you just want to know the pipeline works. |
Targets stack: give it the source and the running app together and it correlates the two. Credentials and focus areas go in --instruction, which is where a grey-box test starts. Everything below is a target you own.
--target ./app or a repo URL. Cheapest, safest, and it finds the class of bug that never reaches a crawler.--instruction to get behind the login.The full history in the checkout is what lets quick mode diff against the base branch. Without it the scope logic has nothing to compare, and you pay for a full scan on every pull request.
--max-budget, drop to quick for routine runs, and move deduplication to a smaller model. Check --max-turns too, since 500 applies to each agent.--instruction or an instruction file: which hosts, which flows, what is out of bounds. Vague scope is what produces noise here, not the model.strix view prints a tokened link that grants access to that run, which includes working exploits against your app. Treat that link like the exploits it contains, and do not paste it into a group chat.The run folders are the artefact worth keeping: each one holds the proof that a bug existed and the date you knew about it. Treat them as sensitive, because that is exactly what they are.
One install, two variables, a budget you always set, and a quick scan on every pull request. The question of whether the thing you just shipped is exploitable stops waiting for a calendar slot.
↑ Unlocks the moment you submit the form above.
I'm Raj Singh, founder of DebtOps.ai and a Claude certified partner. Over the last five years I've managed $25M in ads, built AI solutions for Fortune 100 companies, and installed AI operating systems and AI brains inside small businesses. Everything here is something I've shipped, debugged, or watched a client ship. My goal with AgileSingh is to make you irreplaceable in this AI age.
An agent that can test your app can reach a lot else besides. The OpenBot guide is the governed version of that idea, and the FreeLLMAPI guide is how you stop paying full price for the model doing the reading.