Documentation
How Vigil works
Vigil is a white-hat security agent. It finds vulnerabilities in code, explains them and proposes fixes. It never produces exploit code or payloads.
Two ways to use it
- Read-only public scan: paste the URL of a public GitHub repository. Everyone sees the number of findings per severity; only the maintainers see the details.
- GitHub App: install it on your repositories to receive fixes as pull requests. Pull requests are never merged automatically.
Pipeline
CLONE → DETECT_STACK → RUN_SCANNERS → NORMALIZE (SARIF) → DEDUPE → LLM_TRIAGE → LLM_PATCH → VERIFY_PATCH → OPEN_PR → REPORT
- Scanners: Psalm (taint analysis), PHPStan, Semgrep (p/php, p/javascript), composer audit, npm audit, osv-scanner, gitleaks.
- Every scan runs in an ephemeral Docker container: read-only file system, no Linux capabilities, non-root user, no network while the code is analyzed, 10 minutes maximum, container destroyed afterwards.
- The dependency audit queries the official advisory databases. It runs in a separate container that only receives
composer.json/lockandpackage.json/package-lock.json, never the code. - Triage and fixes use the Claude API. Only the code surrounding each finding is sent; lines containing a potential secret are masked before sending.
- A fix is only proposed if it passes verification: a rescan without the vulnerability and without any new one, then the project's tests (dependencies installed without running any script, tests run without network).
Responsible disclosure
- A scan started by someone who is not a maintainer only shows aggregated statistics publicly.
- Details are only visible to maintainers (admin or maintain permission), verified by signing in with GitHub, or once the vulnerability is fixed.
- The value of a detected secret is never displayed or stored, not even partially.
- The “Report to maintainer” button opens a generic issue, with no exploitable detail, inviting the owner to sign in.
- On a public repository, the description of a fix pull request stays generic: details live on the maintainer-only report.
GitHub App permissions
contents: write: create a branch containing the fix.pull_requests: write: open the pull request.metadata: read: required for every GitHub App.
Installation tokens are scoped to the single repository being scanned and expire after one hour.
Data policy
- Code is not kept: the clone is deleted at the end of every scan, including when it fails.
- We keep the repository name, the commit SHA, and for each finding its rule, file, line, severity and explanation.
- IP addresses are only stored as hashes, for usage limits.
- Every action taken by the agent is written to an audit log.
Wallet and $VIGIL
Connecting a wallet only asks for a message signature, to prove you own it. No transaction, no transfer and no token approval is ever requested. Your balance is read on-chain to determine your tier: see the $VIGIL page.