parryai.dev
How it works

How Parry turns 23 scanners into one verdict.

Most multi-tool security platforms hand you the union of every engine's output and call it coverage. That's how a 50-file PR becomes 312 findings, half of them duplicates. Parry does the work the dashboards don't: it reconciles.

The pipeline

  1. 01

    Sandboxed fan-out

    On every push, Parry clones your repo into an ephemeral workspace. Each engine — across secrets, code analysis, privacy, dependencies, infrastructure, containers, ci/cd, runtime, posture, licensing — runs in its own pinned-version container with no Linux capabilities and no network egress by default. The cloned source is removed within seconds of scan completion. See /trust for the full sandbox spec.

  2. 02

    Fingerprinting + correlation

    Every raw finding gets a stable per-tool fingerprint — sha256(tool · rule · file · trimmed snippet) — that survives line drift, whitespace, and most file moves. On top of that sits a correlation key: when gitleaks, trufflehog, and detect-secrets all flag the same AWS key on the same line, Parry collapses them into one alert and headlines the verified one. Same logic for dependency CVEs across osv-scanner, govulncheck, and grype.

  3. 03

    Reconciliation, two axes

    Within a single scan: corroborated findings show up as one row with an evidence chip ("+2 engines agree") instead of three duplicates. Across scans: Parry diffs the new run's correlation keys against the previous one. Only open rows transition to fixed. Triage decisions don't get re-asked. Suppress one corroborated finding and every engine in its group stays suppressed — no whack-a-mole as scanners come and go.

  4. 04

    AI Review (optional)

    If the org owner has opted in, a reasoning engine reviews the diff for logic flaws deterministic scanners miss — auth bypasses, IDOR, unsafe data flow, cryptographic misuse. Before transmission, the payload is redacted: detected secrets and .env files are stripped in the sandbox. The engine reviews code, not credentials. Findings flow into the same fingerprint pipeline; PR review comments land with one-click suggestion blocks.

  5. 05

    One verdict

    Parry posts a single GitHub Check Run on the commit with the rolled-up counts — open, fixed since last scan, suppressed — and deep links into each finding. PR gating runs on net-new criticals by default.

  6. 06

    Artifacts on demand

    Every scan also produces a CycloneDX SBOM — the manifest of every dependency, version, and license your build pulled in. One-click download from the scan page. Hand it to procurement; satisfy the supply-chain ask without exporting from N tools manually.

  7. 07

    Image scans, same feed

    Some container vulns only show up after the image is built — base-layer CVEs, accidental COPY of secrets, drift from the source repo. Trigger an image scan with a registry reference (ghcr.io/foo/bar:v1.2.3) and it lands in the same scan list, fingerprinted and lifecycled like a code scan. No second dashboard.

Identity

What a fingerprint is

Two stable hashes. Per-tool identity for lifecycle continuity; cross-tool identity for the merge.

fingerprint     = sha256(tool · rule · file · trimmed snippet)
correlation_key = sha256(scope · canonical id · location)
                  // e.g. ("secret", "aws", "src/config.ts:42")
                  //      ("dep",    "GHSA-vh95-rmgr-6w4m",  "lodash")
  • New fingerprintopen
  • Was open, still presentno-op
  • Was open, now absentfixed
  • Was suppressed or acceptedpreserved
Worked example

Two pushes, no spreadsheet

push 1 · feat: add stripe webhook

3 open · 0 fixed
  • open
    Secrets
    Test API key committed in webhook_test.go
  • open
    Code analysis
    Unvalidated input flows into HTTP handler
  • open
    Dependencies
    lodash@4.17.20 — known prototype pollution

Check Run fails on the secret. Triage state established.

push 2 · fix: rotate test key, validate input

1 open · 3 fixed
  • fixed
    Secrets
    Test key removed; fingerprint absent
  • fixed
    Code analysis
    Handler now validates input; fingerprint absent
  • fixed
    Dependencies
    lodash bumped; fingerprint absent
  • open
    Code analysis
    TODO: validate left in a comment — flagged, non-critical

PR passes — the new finding isn't critical, so it doesn't block. You didn't close anything by hand.

Stop triaging the same finding three times.

Install the GitHub App. Free for public repos.