Fast local security linting.
Rust-native. 36 built-in rules. Semgrep-compatible. Single binary.
Example local default-mode benchmark: foxguard built-ins vs Semgrep and OpenGrep auto.
For same-rules engine comparisons, use BENCH_MODE=compat.
Compare foxguard built-ins against Semgrep or OpenGrep auto rules to measure the tools the way users actually run them by default.
Run the same Semgrep-compatible YAML rules across foxguard, Semgrep, and OpenGrep with --no-builtins --rules for a narrower compatibility check.
The default story is built-ins-first. The compatibility story is bring-your-own YAML when you need to align with existing Semgrep or OpenGrep workflows.
Run ./benchmarks/run.sh locally for current numbers and methodology.
foxguard can load a useful Semgrep-compatible subset today. The default product path is still built-in rules. External YAML is there to help teams adopt foxguard without starting from zero.
If you need the full Semgrep or OpenGrep rule universe, use those tools directly. If you want fast local feedback with a compatibility bridge, that is where foxguard fits.
Local-first security linting for the edit-save-commit loop.
No JVM, no Python runtime, no network calls. Fast enough for edit-save-commit loops, hooks, and scripts.
Built-ins are the default. Add a useful Semgrep-compatible YAML subset from a file or directory when needed.
Security checks for JS/TS, Python, and Go, including framework-specific rules.
Use terminal output locally or JSON and SARIF in automation.
foxguard is best positioned as a local-first complement, not a claim of full tool replacement.
--rulesGet started in seconds.
cargo install foxguard npx foxguard . 36 rules across 3 languages, each mapped to a CWE identifier
js/no-eval critical CWE-95 js/no-hardcoded-secret high CWE-798 js/no-sql-injection critical CWE-89 js/no-xss-innerhtml high CWE-79 js/no-command-injection critical CWE-78 js/no-document-write high CWE-79 js/no-open-redirect medium CWE-601 js/no-weak-crypto medium CWE-327 js/no-path-traversal high CWE-22 js/no-prototype-pollution high CWE-1321 js/no-unsafe-regex medium CWE-1333 js/no-cors-star medium CWE-942 js/express-no-hardcoded-session-secret high CWE-798 js/express-cookie-no-secure medium CWE-614 js/express-cookie-no-httponly medium CWE-1004 js/express-direct-response-write high CWE-79 py/no-eval critical CWE-95 py/no-hardcoded-secret high CWE-798 py/no-sql-injection critical CWE-89 py/no-command-injection critical CWE-78 py/no-path-traversal high CWE-22 py/no-weak-crypto medium CWE-327 py/no-pickle high CWE-502 py/no-yaml-load high CWE-502 py/no-debug-true medium CWE-489 py/no-open-redirect medium CWE-601 py/no-cors-star medium CWE-942 py/flask-debug-mode high CWE-489 py/django-secret-key-hardcoded high CWE-798 go/no-sql-injection critical CWE-89 go/no-command-injection critical CWE-78 go/no-hardcoded-secret high CWE-798 go/no-weak-crypto medium CWE-327 go/no-ssrf high CWE-918 go/gin-no-trusted-proxies medium CWE-346 go/net-http-no-timeout medium CWE-400