Red-team your LLM app
in one CI step.
A single static binary that puts your endpoint through the OWASP LLM Top 10 and gates your build on SARIF findings — zero config, zero Python, your own key.
go install github.com/wroughtery/quirn@latest
# or: downloads the release binary and verifies its checksum
curl -fsSL https://raw.githubusercontent.com/wroughtery/quirn/main/scripts/install.sh | shQUIRN_API_KEY=sk-… quirn scan --target https://your-endpoint --format sarif --out quirn.sarif
Into CI in one line
- uses: wroughtery/quirn@v0
with:
target: ${{ secrets.QUIRN_TARGET_URL }}
api-key: ${{ secrets.QUIRN_API_KEY }}
fail-on: high
format: sarif
output: quirn.sarif Add one upload-sarif step and findings land in the GitHub Security tab — the same shelf as CodeQL, gitleaks and trivy. fail-on sets the severity that breaks the build.
Six of ten, honestly
LLM03, LLM04, LLM08 and LLM10 aren't in here — they need more than a black box can honestly prove, so Quirn doesn't pretend to check them. The rationale is in the probe registry, not a roadmap.
- Single static binary
- Stdlib-only Go. No pip, no npm, no vendor cloud.
- Fail-closed gate
- Exit 0 clean, 1 findings, 2 error. A run where every probe is inconclusive fails the build — never a false green.
- Baseline ratchet
- --baseline / --write-baseline: accept what's known, block only what's new.
- Your own judge
- BYO key. The judge model can sit on a different host than the endpoint under test.
- Agent mode
- A loopback honeytool turns the excessive-agency proxy into a confirmed finding; a nonce canary does the same for indirect injection via RAG.
- Four formats
- SARIF, JSON, Markdown, text.
Watch it from the bench
--live streams every payload, reply and verdict to your terminal as the scan runs. --dashboard serves the same stream to a local web view — loopback by default, no account.

It doesn't report what it can't prove. It doesn't pass what it can't check.
- License
- Apache-2.0
- Binary
- single static binary, stdlib-only Go
- Platforms
- darwin, linux, windows × amd64, arm64
- Formats
- SARIF · JSON · Markdown · text
- Gate
- exit 0 / 1 / 2 · fails closed when every probe is inconclusive
- Judge model
- your own key; reused only on the same host unless split out
- Install
- go install · install.sh · wroughtery/quirn@v0
- Checksums
- checksums_sha256.txt on every release
Don't take the binary's word for it
sha256sum --ignore-missing -c checksums_sha256.txt
gh attestation verify quirn_<os>_<arch> --repo wroughtery/quirn