Code, history, local web
Three scan areas, chosen per scan. Every result says what was and was not checked.
Open source · MIT · pre-release
Security scanner for your own projects — code, Git history and your local web app, checked on your machine. It only scans GitHub repositories you are authorized for, checks that again on every scan, and never uploads your code or results.
Install
npm install -g pgardpre-release First release coming soon — build from source today.
git clone https://github.com/JadenMeister/pgard.git && cd pgard && npm ci && npm run buildStar on GitHub Read the docs What it does not do
01
Three steps, all from your terminal.
From npm or Homebrew.
First release coming soon. Build from source today.
npm install -g pgard git clone https://github.com/JadenMeister/pgard.git cd pgard npm ci npm run buildSign in to GitHub once with the device flow. The owner installs the PGARD GitHub App; PGARD then checks five things and tells you what is missing.
pgard login pgard project verifyCode and Git history are scanned on your machine. Read the result in the terminal, in a full-screen panel view, or in the local dashboard.
pgard scan --panels pgard dashboard02
Real output from a build of this repository. Pick a view.
$ pgard --help
pgard - local security checks for GitHub projects you are authorized to scan
Usage:
pgard interactive menu (arrow keys, Enter, Esc, ?)
pgard project verify check repository, GitHub identity, owner approval,
current access and merged contribution
pgard scan code and configuration + Git history
pgard scan code current code and configuration
pgard scan history Git history and tracked files (secrets, risky files)
pgard scan web [--port N] anonymous read-only checks of a local HTTP service
pgard scan all [--port N] code + history + local HTTP service
pgard dashboard [--target-port N]
start the local web dashboard
pgard rules list [--language js|ts|react|vue|go|java|kotlin] [--lang en|ko]
supported rules and unsupported areas
pgard history clear --all | --repo owner/name
delete stored scan results (all, or one repository)
pgard baseline set [--from-current] | show | clear
keep a scan as this repository's baseline; later
scans list matching findings under "In baseline"
pgard doctor diagnose the environment (not an authorization)
pgard advisories update download public OSV vulnerability data (npm, Go)
to this computer; the only non-GitHub download
pgard login sign in to GitHub once and save it in the OS keychain
pgard logout remove the saved GitHub sign-in from the OS keychain
pgard --help | <command> --help
pgard --version
The target is always the Git root of the current directory. Every scan re-runs the
authorization gate; only the GitHub sign-in is reused. Code and results are
processed locally; PGARD contacts GitHub for sign-in and repository metadata only.
GitHub pages open in the browser automatically when stdout is a terminal; pass
--no-browser to scan, project verify, login or dashboard to only print the links.
Exit codes:
0 requested scope completed (findings may exist)
2 invalid command, option or value
3 repository, authorization or contribution check failed
4 part of the scan or the report export failed
5 internal error
130 cancelled
143 terminated by SIGTERM while the panel view was open
$ pgard rules list --language java
pgard 0.1.0 - detection criteria 2026.10-mvp.4
Language filter: java (rules for any language are included)
Code rules (current files)
PG-CMD-003 high OS command built from dynamic strings in Java/Kotlin (Runtime.exec, ProcessBuilder, Commons Exec) [java, kotlin]
PG-PATH-002 high File path from request input or an archive entry used in Java/Kotlin file access (path traversal, zip slip) [java, kotlin]
PG-SQL-005 high SQL built from dynamic strings in Java/Kotlin JDBC, JPA/Hibernate or MyBatis code [java, kotlin]
Git history rules
PG-HYGIENE-001 info Dependency directory committed to Git [any]
PG-SECRET-001 high Environment file committed to Git [any]
PG-SECRET-002 high Secret in a tracked file [any]
PG-SECRET-003 high Secret found in Git history [any]
Local HTTP rules (anonymous GET, any language)
PG-WEB-001 low Content-Security-Policy header is missing
PG-WEB-002 low Clickjacking protection header is missing
PG-WEB-003 info X-Content-Type-Options: nosniff is missing
PG-WEB-004 info Referrer-Policy header is missing
PG-WEB-005 low Cookie is set without HttpOnly
PG-WEB-006 low Cookie is set without SameSite
PG-WEB-007 info Cookie is set without Secure
PG-WEB-008 medium CORS allows any origin together with credentials
PG-WEB-009 high CORS reflects an arbitrary Origin or trusts `null` with credentials
PG-WEB-010 low Server software version is disclosed
PG-WEB-011 medium Directory listing is enabled
PG-WEB-012 high A .env file is served over HTTP
PG-WEB-013 high The .git directory is served over HTTP
Not covered in this version
- Direct database connections
- Docker / container configuration
- Performance and load testing
- Remote (non-loopback) web services
- Authenticated (logged-in) web browsing
- Form submission and other state-changing requests
- Known-vulnerability (CVE/advisory) lookups for dependencies: PGARD ships no vulnerability database
$ pgard scan
PGARD scan result - Partial - some requested areas did not fully run
Repository owner/name @ abcdef123456 - scopes: code, history
Summary
Areas 2 requested — 1 completed, 1 partial (1 not selected)
Rules 3 rules ran (1 in partially scanned areas)
Max per rule 152 files, 340 commits
Elapsed 5.0 s
Findings by severity (3 total)
Critical 1
High 1
Medium 1
Low 0
Info 0
...
Findings (3): 1 confirmed, 2 suspected (needs review)
[CRITICAL] User input concatenated into SQL (confirmed)
src/api/users.ts:3 PG-SQL-001 - confidence medium
Evidence: req.query -> concat -> query()
Fix: Use parameters
Standards:
A05:2025 Injection https://top10.owasp.org/2025/A05_2025-Injection/
CWE-89 Improper Neutralization of Special El... https://cwe.mitre.org/data/definitions/89.html
...
Coverage
[ok] source:typescript (Completed)
[partial] history:commits (Partial)
[not selected] web:anonymous (Not selected)
Standards coverage (OWASP Top 10 2025)
...
[rules ran] A05 Injection - 3 of 37 mapped CWEs have rules (PG-SQL-001, PG-XSS-001)
...
CWE Top 25 2025: 2 rules ran, 0 rules partial, 4 not run, 19 no rules
Rules ran means the mapped rules ran to completion in this scan. It does not mean the project is safe or that the category is covered: see how many of its CWEs have rules. Full detail per entry: --format json (standardsCoverage, ruleStats).
PGARD does not ship or query a vulnerability database. Findings come from the code itself (query statements, server code, configuration), Git history and, if selected, local HTTP checks. Dependency versions are not checked against known vulnerabilities.
PGARD panels owner/name @ abcdef123456 Partial - some r...
[Overview] Charts Coverage Findings (12)
Summary
Areas 3 requested - 1 completed, 1 partial, 1 not
tested (1 not selected)
Rules 2 rules ran (1 in partially scanned areas)
Max per rule 152 files, 500 commits
Elapsed 5.0 s
Findings by severity (12 total)
Critical 1
High 4
Medium 4
Low 2
Info 1
Tab: panel Up/Down: scroll ?: help Esc: back
PGARD panels owner/name @ abcdef123456 Partial - some r...
Overview [Charts] Coverage Findings (12)
By OWASP Top 10 2025 category
A01 Broken Access Control 4
A05 Injection 4
No OWASP mapping 4
By area
code 11
history 1
web 1
Tab: panel Up/Down: scroll ?: help Esc: back
PGARD panels owner/name @ abcdef123456 Partial - some r...
Overview Charts [Coverage] Findings (12)
Coverage
[ok] source:typescript (Completed)
[partial] history:secrets (Partial)
Only the last 500 commits were read because the
repository history is very long.
[not tested] web:anonymous (Not tested)
No confirmed local web target.
[not selected] dependencies:npm (Not selected)
Tab: panel Up/Down: scroll ?: help Esc: back
PGARD panels owner/name @ abcdef123456 Partial - some r...
Overview Charts Coverage [Findings (12)]
> [CRITICAL] confirmed src/module1/handler.ts:11
[HIGH] suspected config/.env (commit 0123456789ab)
[HIGH] suspected src/module11/handler.ts:21
[HIGH] suspected src/module2/handler.ts:12
[HIGH] suspected (suppressed) src/module4/handl...
[MEDIUM] suspected http://127.0.0.1:3000/admin
[MEDIUM] suspected src/module12/handler.ts:22
[MEDIUM] suspected src/module5/handler.ts:15
[MEDIUM] suspected (baseline) src/module7/handler...
[LOW] suspected src/module9/handler.ts:19
[LOW] informational src/module8/handler.ts:18
[INFO] informational src/module10/handler.ts:20
Tab: panel Up/Down: scroll ?: help Esc: back
pgard scan --panels — read-only full-screen view in the terminal (test fixture, 60x20)
Help and rules list are real output of the built CLI (offline, no sign-in). The scan result and panel view come from the repository's own test snapshots: fixture data for a placeholder project, shortened with ... where noted. They are not a scan of a real repository.
03
What is in the box today. Each line matches the README.
Three scan areas, chosen per scan. Every result says what was and was not checked.
JavaScript, TypeScript, React, Vue and Go. Java and Kotlin for SQL, command and path rules. Python and PHP are not analyzed yet.
Rules map to OWASP Top 10 2025 and CWE Top 25 2025, and to SEI CERT Java rules where one applies. The map never says “safe”.
Machine-readable output for scripts and code scanning, and reports you can read or share. Rule texts and report headings in English or Korean; scan evidence stays English.
pgard scan --panels opens a read-only full-screen view in your terminal: overview, charts, coverage, findings.
pgard dashboard starts a local web dashboard on 127.0.0.1 with a private session token. It is not hosted anywhere.
Keep a scan as the baseline and later scans highlight what is new. Stored results stay on your computer and can be deleted.
A repeat scan only looks at what changed and says so in the result. --full scans everything again.
Five checks run again before every scan. There is no option to skip them.
04
Three areas, picked per scan, and what runs depends on the language. Run pgard rules list for the full catalog.
code
Current source code and configuration.
history
Committed secrets, past and present.
web
Only a service you run on 127.0.0.1, and only after you confirm it.
| Language | Categories |
|---|---|
| JavaScript, TypeScript | SQL injection, XSS, SSRF, command execution, path traversal, cryptography, password storage, cookies, CSRF, rate limiting |
| React, Vue | XSS in dangerouslySetInnerHTML and v-html, plus the JavaScript and TypeScript rules |
| Go | SQL injection (database/sql, GORM), command execution, path traversal, SSRF, cryptography, cookies |
| Java, Kotlin | Only three categories: SQL injection, command execution and path traversal (also MyBatis mapper XML). Nothing else is checked yet. |
| Python, PHP | Detected, not analyzed yet. The coverage shows them as not tested. |
The standards map shows rules ran, rules partial, not run or no rules for each OWASP Top 10 2025 category and CWE Top 25 2025 entry. It never says safe, and nothing is shown in green.
05
PGARD writes files and streams. Where they go is your decision; PGARD uploads nothing.
SARIF 2.1.0 on stdout. After a local scan that exits 0, upload it to GitHub code scanning yourself, for example with gh api; the README shows the exact command. There is no CI workflow, because a CI runner cannot pass the authorization gate. Never upload after exit code 3, 4 or 5: a partial scan would close alerts for areas that were never checked. README: SARIF output
pgard scan --format sarif > pgard.sarifOnly the redacted result goes to stdout; progress and prompts go to stderr, so the file is valid JSON. The schema is documented and versioned. Result schema
pgard scan --format json > result.jsonRedacted reports in English or Korean (scan evidence stays English), written to an existing folder you choose. Existing files are never overwritten.
pgard scan --report both --output-dir ./reports07
Your code, history and results are processed on your computer.
This website (pgard.dev) is static pages only. It does not scan anything, collect data, or offer sign-in or upload. It is not the dashboard: the dashboard runs on your computer.
08
Short and frank. PGARD is pre-release.
09
People who own the code they scan.
Scan the working tree and Git history of your own project, including uncommitted files. A repeat scan only re-reads what changed.
Keep a baseline so new findings stand out, and upload SARIF to code scanning yourself after a local scan. An organization repository can be scanned by an organization owner.
Each finding comes with its location, redacted evidence, a fix, and links to the OWASP, CWE and CERT entries it maps to.
10
There is no pricing section because there is nothing to price.
11
Node.js 22.23.4, 24.22.1 or 26.12.1 (or a newer patch), Git, on macOS, Linux or Windows.
npm install -g pgard npx pgard doctor npm install -g pgard npx pgard doctorAvailable after the first release; shown here for reference, not copyable. Until then, npm install -g pgard installs only a placeholder package with no pgard command.
brew tap jadenmeister/pgard brew install pgard brew tap jadenmeister/pgard brew install pgardOr in one line: brew install jadenmeister/pgard/pgard
The tap is created with the first release; these commands are shown for reference until then.
git clone https://github.com/JadenMeister/pgard.git cd pgard npm ci npm run buildOptional: npm link -w @pgard/cli puts pgard on your PATH. Otherwise run node apps/cli/dist/bin/pgard.js.
Run these from the root of the project you want to scan.
pgard doctor pgard login pgard project verify pgard scan12
No. Code, Git history and results are processed on your computer and are not uploaded. During scans PGARD contacts GitHub only, for sign-in and the metadata needed for authorization (including the SHAs of local commits, to check contribution). The one other destination is the OSV export host, and only if you run pgard advisories update yourself: it downloads public data and uploads nothing.
To prove you are allowed to scan. PGARD checks your GitHub identity, that the owner installed the PGARD GitHub App, that you currently have access and that you own the repository or contributed to it. The token is kept in your OS keychain, never in a file.
Your own repositories, once the PGARD GitHub App is installed on your account (PGARD guides you through it). Someone else's personal repository only if its owner installed the App and you have current read access plus a merged pull request or a verified signed commit on the default branch. Organization repositories only if you are an active owner of the organization and the App is installed with access to the repository. Remote repositories are never scanned: the target is always the Git root of your current directory.
No. Findings are signals, detection is not complete, and no findings does not mean secure. Every result lists what was not checked, and the standards map shows how few weaknesses in a category have a rule at all.
Python and PHP files are detected but not analyzed yet; the coverage shows them as not tested. Java and Kotlin are checked for SQL injection, command execution and path traversal only.
Yes. macOS, Linux and Windows are supported and CI runs the full test suite on all three. On Windows the sign-in is kept in Credential Manager. The old console window (legacy conhost) and visual rendering have not been verified by a user.
Not today. Every scan needs a GitHub sign-in that a CI runner does not have, so a runner would produce a blocked result. What works: run PGARD locally and read --format json or --format sarif and the exit codes (0 completed, 3 blocked, 4 partial) in your own scripts.
PGARD runs on your computer and uploads nothing, so your code is not copied to a service. The trade-offs are that you run it yourself, there is no hosted dashboard or continuous monitoring, and it asks GitHub whether you are allowed to scan.
Not yet. PGARD ships no vulnerability database and does not match dependency versions against advisories. It can read lockfiles and download public OSV data on request, which is groundwork for a later check.
Privately, not in a public issue. Use the Report a vulnerability button on the repository's Security tab. See the security policy for the scope. There is no bug bounty.
13
Themes, not promises. There are no dates, and plans change.
14
PGARD is developed in the open on GitHub. There is no newsletter and no backend; GitHub is the place to follow along.