openauditA100out of 100: openaudit's audit of itself

Everything under the hood

37 built-in auditors and 52 wrapped scanners, merged into one scored report. Run it from your terminal, your CI or your agent.

bunx @openaudit/cli .

Built for agents

Your agent runs the audit, fixes what it finds and checks the fix.

  • MCP server

    For Claude Code, Cursor, Codex and more. Over stdio or HTTP.

  • 10 playbooks

    For checks that need judgment. Your agent runs them, no extra API key.

  • JSON mode

    --json prints one report and nothing else.

  • Agent skill

    SKILL.md teaches the audit, fix, verify loop.

claude mcp add openaudit -- bunx @openaudit/cli mcp
Agent setup
Example session in Claude Code
  1. Audit this project with openaudit (https://openaudit.se/llms.txt). Fix what matters most, then run it again to check.
  2. openaudit run_audit target: "."
  3. 78/100, grade C. 1 critical and 3 high findings from 41 auditors.
  4. openaudit get_playbook id: "agent.authz"
  5. Authentication and authorization review: inventory every route, then check who can reach it.
  6. Read src/routes/admin.ts
  7. openaudit submit_findings 2 findings
  8. Merged into the report. Security 61 to 54.
  9. Edit src/routes/admin.ts, src/config.ts
  10. openaudit compare_reports
  11. 3 fixed, 0 new.

Ten areas, each with its own grade

Every finding lands in one area. Each area gets a 0 to 100 score.

Security

Secrets, risky code, TLS and headers, exposed files, container and cloud config.

Example finding
CriticalAWS access key IDsrc/config.ts:14code.secrets/aws-access-key-id

Wrapped tools

  • semgrep
  • trivy
  • gitleaks
  • osv-scanner
  • trufflehog
  • checkov
  • zizmor
  • grype
  • bandit
  • gosec
All 34 wrapped toolsShow the top 10 only
  • govulncheck
  • hadolint
  • ruff
  • kubescape
  • actionlint
  • shellcheck
  • brakeman
  • bun
  • cargo-audit
  • kube-linter
  • mobsfscan
  • npm
  • pip-audit
  • pmd
  • pnpm
  • sslyze
  • cargo
  • docker
  • dockle
  • golangci-lint
  • guarddog
  • kics
  • prowler
  • testssl.sh
All 66 security auditors

Accessibility

WCAG checks in code, on rendered pages and in Android layouts.

Example finding
HighImage without alt textsrc/components/Hero.tsx:22code.accessibility/img-alt-missing

Wrapped tools

  • lighthouse
  • oxlint
  • eslint
  • pa11y
All 10 accessibility auditors

Performance

Page weight, caching, Core Web Vitals, bundle and image size.

Example finding
MediumRender-blocking script in <head>https://example.com/ head > scriptweb.performance/render-blocking-script

Wrapped tools

  • lighthouse
  • oxlint
  • eslint
  • pmd
  • cargo
All 11 performance auditors

SEO

Titles, descriptions, crawlability, sitemaps and broken links.

Example finding
MediumBroken internal link (404)https://example.com/pricingweb.seo/broken-link

Wrapped tools

  • lighthouse
All 3 seo auditors

Privacy

Trackers before consent, analytics SDKs, personal data in logs.

Example finding
MediumTracking cookies set before consenthttps://example.com/webapp.browser/tracking-cookie-before-consent

Wrapped tools

  • mobsfscan
All 9 privacy auditors

Best practices

Repo hygiene, Dockerfile and IaC lint, GitHub Actions hardening.

Example finding
LowADD used where COPY sufficesDockerfile:7container.dockerfile/add-instead-of-copy

Wrapped tools

  • semgrep
  • lighthouse
  • checkov
  • hadolint
  • actionlint
  • kube-linter
  • kubeconform
  • spectral
  • tflint
  • dockle
All 11 wrapped toolsShow the top 10 only
  • kics
All 21 best practices auditors

Reliability

Type errors, broken pages, redirect chains, missing probes.

Example finding
LowHealth probes missingk8s/deployment.yaml:18iac.kubernetes/probes-missing

Wrapped tools

  • ruff
  • oxlint
  • eslint
  • tsc
  • kubescape
  • actionlint
  • shellcheck
  • biome
  • kube-linter
  • kubeconform
All 20 wrapped toolsShow the top 10 only
  • oasdiff
  • phpstan
  • pmd
  • spectral
  • staticcheck
  • tflint
  • cargo
  • golangci-lint
  • kics
  • mypy
All 27 reliability auditors

Maintainability

Lint, strict typing, duplication, dead code, huge files.

Example finding
MediumTypeScript strict mode disabledtsconfig.json:4code.quality/ts-strict-disabled

Wrapped tools

  • ruff
  • oxlint
  • eslint
  • tsc
  • biome
  • jscpd
  • phpstan
  • pmd
  • staticcheck
  • cargo
All 13 wrapped toolsShow the top 10 only
  • golangci-lint
  • knip
  • mypy
All 16 maintainability auditors

Supply chain

Vulnerable dependencies, unpinned versions, licences, image CVEs.

Example finding
MediumBase image uses a mutable tagDockerfile:1container.dockerfile/from-latest

Wrapped tools

  • trivy
  • osv-scanner
  • zizmor
  • grype
  • govulncheck
  • brakeman
  • bun
  • cargo-audit
  • npm
  • pip-audit
All 15 wrapped toolsShow the top 10 only
  • pnpm
  • scorecard
  • tflint
  • guarddog
  • syft
All 26 supply chain auditors

Compliance

Licence duties, cookie consent, OWASP and CWE mapping, CIS benchmarks.

Example finding
Mediumvendor/parser.c: GPL-3.0-onlyvendor/parser.c:1code.scancode/strong-copyleft

Wrapped tools

  • prowler
  • scancode
  • syft
All 7 compliance auditors

Point it at anything you ship

It detects what you point it at and runs what applies.

Coverage by target and language

By target

Number of auditors for each target and area
TargetSecuritySecAccessibilityA11yPerformancePerfSEOSEOPrivacyPrivBest practicesBPReliabilityRelMaintainabilityMntSupply chainSupComplianceComp
Codebasebunx @openaudit/cli .34 auditors3 auditors6 auditorsnone3 auditors6 auditors16 auditors16 auditors17 auditors5 auditors
URLbunx @openaudit/cli https://example.com10 auditors5 auditors2 auditors3 auditors3 auditors4 auditors1 auditorsnonenone2 auditors
Web appbunx @openaudit/cli https://example.com --browser5 auditors4 auditors1 auditors1 auditors1 auditors1 auditors1 auditorsnonenonenone
Containerbunx @openaudit/cli image:nginx:1.277 auditorsnone1 auditorsnonenone4 auditors2 auditorsnone4 auditorsnone
Infrastructure as codebunx @openaudit/cli ./infra11 auditorsnonenonenonenone8 auditors8 auditorsnone5 auditorsnone
Mobile buildbunx @openaudit/cli ./app-release.apk5 auditors1 auditors1 auditorsnone3 auditors1 auditorsnonenone1 auditorsnone
Cloud accountbunx @openaudit/cli cloud:aws --only cloud1 auditorsnonenonenonenonenonenonenonenone1 auditors

Bigger dot, more auditors.

By language

LanguageSecurityDependenciesTypes, lint and quality
JavaScript / TypeScriptbuilt-in rules, Semgrepnpm, pnpm, Yarn and Bun lockfiles via OSV.dev; npm / pnpm / bun audittsc, oxlint (with its React, jsx-a11y and Next.js rules when the project uses them), Biome, ESLint*, knip*, strict tsconfig checks
Pythonbuilt-in rules, Semgrep, Banditrequirements*.txt, poetry.lock; pip-auditruff, mypy*, type-checker configuration
Gobuilt-in rules, Semgrep, gosecgo.mod; govulncheck*staticcheck, golangci-lint*
RustSemgrepCargo.lock; cargo-auditclippy*, [lints] and unsafe policy checks
Rubybuilt-in rules, Semgrep, Brakeman (Rails)Gemfile.lockNone
PHPbuilt-in rules, Semgrepcomposer.lockPHPStan
Java / Kotlinbuilt-in rules, Semgrep, mobsfscan (Android)Maven and Gradle via osv-scanner and TrivyPMD (Java)
C# / .NETbuilt-in rules, SemgrepNuGet via osv-scanner and TrivyNone
Swift / Objective-Cmobsfscan (iOS)NoneNone
ShellNoneNoneShellCheck, set -euo pipefail checks
HTML, CSS, JSX, Vue, Svelteaccessibility and performance rulesNoneNone

* Opt-in: run it with --only <id>, e.g. --only code.clippy. The next section explains why some tools are opt-in.

One issue, one finding

Many tools, one result.

  1. Run

    Point it at a folder, URL, image or cloud account. Missing tools are skipped.

  2. Merge and score

    Duplicates merge into one finding. Each area scores 0 to 100.

    One leaked key, three tools, one finding.

  3. Report and gate

    HTML, JSON, SARIF, Markdown or CSV. --fail-on fails the CI run.

A report people actually read

One HTML file. Works offline, prints cleanly.

The openaudit HTML report: an overall grade dial with one arc per area, severity counts and a navigation rail listing every areaThe openaudit HTML report in the dark themeOpen the live report
openaudit's own report.
  1. Overview

    One grade, one arc per area.

  2. A tab per area

    Filters, search, findings by rule.

  3. OWASP and CWE

    Mapped to both top lists.

  4. Downloads

    HTML, JSON, SARIF, Markdown or CSV.

Runs where you already work

Same report from every route.

CLI

bunx @openaudit/cli

CLI reference

bunx @openaudit/cli .                            # a codebase
bunx @openaudit/cli https://example.com          # a live site (add --browser for Playwright + axe-core)
bunx @openaudit/cli ./app-release.apk            # a mobile build (.apk, .aab, .ipa)
bunx @openaudit/cli image:nginx:1.27             # a container image
bunx @openaudit/cli cloud:aws --only cloud       # a live cloud account (Prowler)

bunx @openaudit/cli . -f html -o report          # write the interactive report to report/
bunx @openaudit/cli doctor                       # which optional scanners are installed

MCP

openaudit mcp

MCP and agents

claude mcp add openaudit -- bunx @openaudit/cli mcp

GitHub Action

wezter96/openaudit

Inputs and outputs

permissions:
  contents: read
  security-events: write

steps:
  - uses: actions/checkout@v7
    with:
      fetch-depth: 0 # diff mode compares against the base branch
  - uses: wezter96/openaudit@main # pin to a commit SHA in real use
    with:
      fail-on: high

Docker

ghcr.io/wezter96/openaudit

Tags and included scanners

# Audit the current directory. Run as yourself: git refuses repositories owned by
# another user, and reports are written as you
docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/src" -w /src \
  ghcr.io/wezter96/openaudit . -f html,sarif -o openaudit-report --fail-on high

# Audit a live site with a real browser
docker run --rm ghcr.io/wezter96/openaudit:latest-full https://example.com --browser

# See which tools are installed
docker run --rm ghcr.io/wezter96/openaudit doctor

GitLab CI

include: remote

GitLab setup

include:
  - remote: https://raw.githubusercontent.com/wezter96/openaudit/main/integrations/gitlab/openaudit.gitlab-ci.yml

variables:
  OPENAUDIT_FAIL_ON: high   # optional

pre-commit

id: openaudit

Hooks and stages

repos:
  - repo: https://github.com/wezter96/openaudit
    rev: main # pin to a tag or commit
    hooks:
      - id: openaudit          # needs Bun on PATH
      # - id: openaudit-docker # or: the Docker image, nothing else to install

SARIF

-f sarif

Code scanning setup

- uses: wezter96/openaudit@<sha>
  with:
    fail-on: high
    # Trusted on pushes, where the file is what was merged or pushed by someone
    # with write access. On pull_request and pull_request_target the PR can edit it.
    config: ${{ github.event_name == 'push' && 'openaudit.config.jsonc' || '' }}
- uses: oven-sh/setup-bun@v2
- name: openaudit
  run: bunx @openaudit/cli . --format sarif,markdown --out openaudit --fail-on high
- name: Upload SARIF
  if: always()
  uses: github/codeql-action/upload-sarif@v4
  with:
    sarif_file: openaudit/openaudit-report.sarif
    category: openaudit
- name: Job summary
  if: always()
  run: cat openaudit/openaudit-report.md >> "$GITHUB_STEP_SUMMARY"
{
  "mcpServers": {
    "openaudit": { "command": "bunx", "args": ["@openaudit/cli", "mcp"] }
  }
}

Safe on hostile input

Every target is treated as hostile. Nothing it scans gets built or run.

Safety model

Five guards against hostile targets
  • Files

    Reads stay in the project. Symlinks out are never followed.

  • HTTP

    Your headers go only to the target. Redirects drop credentials.

  • Agents

    Its own agents get no shell. The browser stays on the target.

  • Wrapped tools

    Nothing gets built or installed. Linters that run code are opt-in.

  • Git

    Hooks and fsmonitor are off. Diffs compare commits.