New: CodeInspectus 4.0, five engines, including our own

For people who build with AI

You built it with AI.
Is it secure?

Your secret keys, your users’ private data, the bugs you can’t spot by reading. AI coding tools can leave them exposed without telling you. CodeInspectus checks your code on your own computer, then helps your AI assistant fix what it finds.

Illustration only, not a real scan: an example conversation in which an AI assistant runs CodeInspectus locally and lists three example findings.

Can you check this project for security problems?

I ran CodeInspectus locally. Nothing left your machine. I found 3 issues worth fixing first. Want me to start with the exposed key?

Findings, most serious first

  • CriticalStripe secret key in client codesrc/lib/payments.ts:42 · value hidden
  • HighSQL built from request inputapi/orders.php:118
  • MediumNode.js 18 has reached end of life.nvmrc · Synvoya engine
How it works in 30 seconds

Four plain steps. No security degree required.

  1. Connect

    Register it once with your AI coding assistant: Claude Code, Codex, Cursor or any MCP app. It can call CodeInspectus for you, or you can use the same scanner directly from a terminal and in CI.

  2. Scan

    It checks your code locally, on your own machine, for exposed secrets, open data and risky code. Nothing is sent anywhere.

  3. Fix

    It explains problems plainly, in normal language: what each one is, where it is, and why it matters to you. It asks before fixing anything, so nothing in your code changes until you say yes.

  4. Confirm

    A rescan shows whether each fix worked. You stay in control of every edit, and nothing is marked fixed on a guess.

Get started

Hand your assistant a security reviewer.

One command connects CodeInspectus to your assistant. The first time you ask for a scan, it asks once and sets up all five engines: the Synvoya engine is built in, and the four open-source engines download after you approve. Prefer the terminal? npx codeinspectus setup --all --path . installs the four open-source engines plus the OSV databases for the ecosystems found in this folder.

Run this in your terminal to add CodeInspectus to Claude Code.

claude mcp add-json codeinspectus '{"command":"npx","args":["-y","codeinspectus"]}'

Run this in your terminal to add CodeInspectus to the Codex CLI.

codex mcp add codeinspectus -- npx -y codeinspectus

Add this block to ~/.cursor/mcp.json, or .cursor/mcp.json for one project.

{
  "mcpServers": {
    "codeinspectus": { "command": "npx", "args": ["-y", "codeinspectus"] }
  }
}

Run this in your terminal to add CodeInspectus to VS Code.

code --add-mcp '{"name":"codeinspectus","command":"npx","args":["-y","codeinspectus"]}'

Then ask your assistant: scan this project for security issues. It asks before downloading anything.

See setup detailsHide setup details

Start in three steps

  1. Run CodeInspectus

    Needs Node.js 22+. Nothing downloads until you approve.

    Before you start: CodeInspectus needs Node.js 22+ (Node 24 LTS recommended). You do not need to install the scanner engines or Cosign separately.

    Your first terminal run checks local engine health without using the network, then shows what Opengrep, Gitleaks, Trivy and Google’s osv-scanner contribute (osv-scanner is optional, with databases downloaded only for the ecosystems you approve), their licenses, exact platform download sizes, and the estimated Trivy database size. Choose all, select components, or decline.

     npx -y codeinspectus

    Nothing downloads until you approve it. CodeInspectus then installs only missing or outdated verified components beneath ~/.codeinspectus. npm installation itself has no engine-downloading lifecycle script, and healthy components remain no-download no-ops.

  2. Add it to your assistant

    The command above, or one standard mcpServers block.

    Use the command for your assistant above. Any MCP-capable assistant also takes the standard mcpServers block, so the same three lines work across them:

    {
      "mcpServers": {
        "codeinspectus": { "command": "npx", "args": ["-y", "codeinspectus"] }
      }
    }

    Windsurf: add the block to ~/.codeium/windsurf/mcp_config.json. Cline: open the MCP Servers panel, choose Configure, and add the block to cline_mcp_settings.json.

    On first use, your assistant asks CodeInspectus for an offline setup plan, explains the components, and asks your permission before any download. Only after approval can it install the selected components. MCP servers cannot open a prompt by themselves, so this happens when you ask your assistant to set up or scan the project.

  3. Ask for the first scan

    Ask, review the findings, approve each fix.

    No dashboard. Your assistant now has ten tools: seven set up, read, and report without touching your code, and three plan, apply, and roll back an optional cleanup you approve. If setup is incomplete, the assistant shows the plan and asks before downloading. Then CodeInspectus surfaces findings in plain language, your assistant proposes fixes, you approve each one, and a rescan confirms. Your assistant writes only what you okay.

    Then just say: scan this project for security issues

Register it for every project

To register it for every project instead: claude mcp add --scope user codeinspectus -- npx -y codeinspectus

Use config.toml instead

Or add a [mcp_servers.codeinspectus] table to ~/.codex/config.toml with the same command and args.

Other assistants, shell and CI

CodeInspectus runs as a local MCP server and terminal CLI. Register it once for Claude Code, Cursor, Codex, Windsurf, or Cline, or call the same scanner directly from your shell and CI. Every scan runs on your machine.

no account no upload zero egress at scan

What it checks for

The mistakes AI-built apps make most.

Six kinds of repository risk and evidence, in plain terms. Each one is worth reviewing before you ship.

See all six risksHide the six risks
  • Exposed secret keys

    Any language

    Keys that were never meant to be public.

    Passwords, API keys and tokens that ended up in your code, including ones accidentally bundled into the app your visitors download to their own browsers.

    Why it matters: anyone who finds one can run up charges on your accounts or reach the data behind them.

  • Open databases

    Config

    Can strangers read your users’ private data?

    When an AI tool sets up a database, it often leaves the doors open, so any visitor can read, or even change, other people’s records.

    Why it matters: this is the most common way AI-built apps expose private user data.

  • AI-specific traps

    AI code

    When your own AI can be tricked.

    If your app feeds outside text into an AI model, an attacker can hide instructions inside that text and push the model into misusing the access you gave it.

    Why it matters: a newer risk older tools don’t look for. We flag it as a possibility, never a certainty.

  • Outdated packages

    Many ecosystems

    Known holes in your building blocks.

    The open-source packages your app is built on can have publicly known weaknesses, often with a fix already available that you simply haven’t picked up.

    Why it matters: attackers scan for exactly these, because the weakness is already public knowledge.

  • Hidden source markers

    Separate audit

    Characters that can mislead a reviewer.

    CodeInspectus checks for dangerous bidirectional controls, zero-width and other default-ignorable token characters, concealed Unicode tags, encoded variation-selector runs, and reviewed mixed-script confusables.

    Why it matters: these characters can conceal payloads or make source appear to say something different. They are source-integrity evidence, not proof that AI wrote the code.

  • AI provenance

    Separate audit

    What the repository explicitly says about AI.

    CodeInspectus audits supported source and configuration declarations, Git co-author trailers, media metadata, and local C2PA Content Credentials.

    Why it matters: provenance records can support review and disclosure, but they are claims and signed records, not proof of who authored the work. C2PA validation requires the optional official validator.

Secrets and broad dependency/IaC coverage work across many codebases. First-party native packs now add bounded checks for JavaScript/TypeScript, Flutter/Dart, Android, iOS, React Native/Expo, Python AI/API frameworks, Go, Java, C#, PHP, Rust, Ruby, Firebase, and GitHub Actions, plus Synvoya rule packs for PHP and Node.js. Every scan reports which packs ran and where coverage was limited. Source-integrity and AI-provenance audits run separately from the 126 CWE-based vulnerability detections and are not counted in vulnerability totals.

Your code stays yours

Everything stays on your computer.

Your code never leaves your machine. No account. No upload. No company sees your code, not even us. And you can check this yourself.

CodeInspectus runs as a small program on your own computer. Your AI assistant talks to it directly, the checks run locally, and nothing phones home. It works offline after install: approved setup or repair uses the network only to fetch missing verified components or refresh the offline vulnerability database, and scans remain offline.

Five engines

Four trusted open-source scanners, plus one of our own.

Best-in-class scanners are the floor you should expect. The fifth engine, Synvoya, is ours. Open any engine to see exactly what it covers.

Each open-source engine is a SHA-pinned binary, hash-verified before it executes, and never forked. Each one runs as a local subprocess, emits SARIF or JSON, and the normalizer folds it into the shared schema.

Synvoya engine

The part we write ourselves, for what the open-source engines miss. Ours · ships inside the package

Built in: it needs no download and runs by default.

  • Gap layer: recent advisories, declared versions and end-of-life lines330 advisories
  • PHP rule pack19 rules
  • Node.js rule pack12 rules
  • First-party checks across 16 native packs72 rules
  • Copied-in JavaScript libraries and GitHub Actionsby version
  • Dart and Flutter Pub advisoriesoffline

Opengrep

Code analysis for injection, XSS and unsafe patterns. 1.33.1 · LGPL-2.1
Static analysis, SAST

Pattern-based source analysis tuned to the OWASP Top 10. Injection, broken access paths, unsafe deserialization: the structural mistakes a model repeats because the training data did.

local subprocess → SARIF → normalizer

  • Injection and XSSCWE-79 / 89
  • Path traversalCWE-22
  • Unsafe eval sinksCWE-94

Gitleaks

Keys and tokens, with every value hidden. 8.30.1 · MIT
Secrets detection

Finds the keys, tokens and credentials the model helpfully pasted inline. Every secret value is redacted in the output you and your agent see. The finding stays, the secret does not travel.

local subprocess → SARIF → normalizer

  • Hard-coded keysCWE-798
  • Live API tokensredacted
  • Private materialflagged

Trivy

Package holes, infrastructure settings, SBOMs. 0.76.1 · Apache-2.0
Dependencies, IaC, SBOM

Dependency CVEs and software composition, infrastructure misconfiguration, license findings when you opt in, and a software bill of materials. Always run with the offline flags, so the scan stays on your machine.

local subprocess → SARIF → normalizer

  • Dependency CVEsSCA
  • IaC misconfigconfig
  • SBOM, opt-in licenseinventory

osv-scanner

Lockfiles against OSV.dev, by Google. 2.7.0 · Apache-2.0
Dependencies, OSV.dev

Google’s scanner matches lockfiles against OSV.dev advisory data, including OpenSSF malicious-package records. It reads only the per-ecosystem databases you approved, and every scan runs offline.

local subprocess → JSON → normalizer

  • Lockfile CVEsSCA
  • Malicious packagesMAL-
  • Vendored JS librariesvia SBOM

Pinned versions: Opengrep 1.33.1 · Gitleaks 8.30.1 · Trivy 0.76.1 · osv-scanner 2.7.0. CodeInspectus orchestrates, it never forks: approved setup downloads official binaries from upstream, CodeInspectus verifies each SHA before execution, and a mismatch is refused. The engines keep their own licenses (Opengrep LGPL-2.1, Gitleaks MIT, Trivy Apache-2.0, osv-scanner Apache-2.0) and are not embedded in the npm package; CodeInspectus setup fetches them for you only after approval.

Coverage and language support

Honest about what runs where.

Commodity engines provide broad secrets, dependency and IaC coverage, plus JavaScript, TypeScript, Python and PHP SAST. 16 first-party packs add narrower language, framework and workflow checks, and every scan reports where they applied and what they left out. We name the exact scope instead of claiming every language.

See the detailsHide the details
  • Secrets

    Any language

    Hard-coded credentials and leaked keys. Detection is value and pattern based, not language-parsed, so it runs the same on any codebase in any language.

    Gitleaks + CodeInspectus secret checks

  • Dependencies, IaC, SBOM, license

    Many ecosystems

    Trivy covers vulnerable dependencies, infrastructure misconfiguration, SBOM and opt-in license findings across many ecosystems and IaC formats. osv-scanner adds offline OSV.dev matching, including malicious-package records, for the ecosystems whose databases you approve. CodeInspectus also has first-party, offline, exact-version Pub advisory matching and CycloneDX/SPDX inventory for supported Dart and Flutter pubspec.lock files. Unsupported sources and malformed inputs are reported, not inferred safe. See Trivy’s scope

    Trivy + osv-scanner + CodeInspectus Pub

  • Static analysis (SAST)

    JavaScript, TypeScript, Python, PHP

    Injection, XSS, SSRF, weak crypto, insecure deserialization and explicit CORS misconfiguration. CodeInspectus ships its own Apache-2.0 security-baseline ruleset (15 JavaScript/TypeScript rules and 5 Python rules) plus the Synvoya packs, 19 PHP rules and 12 Node.js rules, shipped only after passing a precision test on repositories they were never tuned on. Opengrep runs with no network registry packs, so coverage is exactly these languages, deliberately narrower than Opengrep’s full engine. This is not broad multi-language SAST.

    Opengrep + the security-baseline and Synvoya rulesets

  • Recent advisories and end-of-life

    Declared versions

    Offline checks for what the other engines miss: declared Node.js, PHP, Python, Ruby, Go, .NET and Java versions in version files, manifests, CI steps and image tags; end-of-life lines; exploited products such as Adobe Commerce and WordPress core; vendored and CDN-loaded JavaScript libraries; and third-party GitHub Actions. It reads only what the repository declares, so findings say declared, not deployed.

    Synvoya gap layer · 330 advisories

  • First-party framework checks

    16 native packs · 72 rules

    Bounded, first-party checks for JavaScript/TypeScript AI-code patterns; Flutter/Dart source; Android and iOS repository configuration; React Native and Expo; Python AI/API frameworks; exact OpenAI tool-execution flows in Go, Java, C#, PHP, Rust and Ruby; Firebase Security Rules; GitHub Actions workflows; plus two native JavaScript baseline rules. Technology evidence gates each pack. These are static repository checks, not whole-program analysis, runtime testing or complete language coverage.

    45 analyzers with explicit pack coverage

Go, Java, C#, Rust and Ruby native coverage is one documented AI tool-execution rule per ecosystem; PHP also has the Synvoya PHP pack. Plain Dart can receive native Pub SCA/SBOM without activating the Flutter source pack. Python native coverage applies only to ten documented AI/API source shapes. Scan output makes these distinctions explicit; a pack that ran is not a claim of complete security coverage.

The agent-native loop

Scan, fix, rescan.

CodeInspectus scans never write to your code. They return findings with remediation, the agent applies the fix, then a rescan confirms the finding is gone.

Confirmed, never “probably fixed”

  1. Scan

    codeinspectus_scan

    Runs all five engines over the path. You get CWE-keyed findings, each with severity, remediation and framework tags.

  2. Fix

    agent applies

    The agent reads the remediation and edits your code. CodeInspectus touches nothing. Use explain_finding for the why.

  3. Rescan

    codeinspectus_rescan

    Re-runs on the changed files. Closed findings drop out, anything new surfaces, and the loop continues until clean.

How you run it

Your assistant can run it. So can your terminal.

CodeInspectus plugs into the AI coding tools you already use: Claude Code, Cursor, Codex, Windsurf and Cline. The same local core also powers the local CLI and CI policy.

See all the ways to run itHide the ways to run it

One scanner. Three ways to run it.

The CodeInspectus workflow: the MCP server, terminal CLI and CI gate use the same local scan core and the same honest coverage contract. No parallel cloud scanner, account or dashboard.

  • In your assistant (MCP)

    Ten MCP tools over stdio

    Your coding agent plans first-use setup, asks before downloads, scans, explains, asks before edits, and rescans. Optional shipped skills add one-finding remediation, untrusted-document threat modelling, and bounded multi-agent review without changing scanner truth.

    npx -y codeinspectus
  • In your terminal (CLI)

    First-class local CLI

    Preflight, scan, export, compare, baseline, triage, Git diff, working tree, sealed bundles, bounded bulk repositories, and bounded commit history.

    npx codeinspectus scan . --format json
  • In CI

    Coverage-aware enforcement

    Fail on severity or proven-new findings only after sufficient coverage. Partial or unknown work exits 2 instead of becoming a false green check.

    npx codeinspectus scan . --baseline SCAN_ID --fail-on-new-severity high

Output and evidence

Machine output
Versioned V3 JSON and SARIF, deterministic spreadsheet-safe CSV, and non-CWE repository-trust evidence.
Local history
Bounded listing, arbitrary compatible comparison, baselines, and append-only triage context.
Git scope
Exact diff and working-tree snapshots with changed and supporting context kept distinct.
Sealed evidence
Redacted bundles with a versioned manifest and verified hashes before export or comparison.
Typed integration
A public TypeScript SDK wraps the exact installed local CLI; it does not duplicate scanner logic.
Review handoff
Redacted GitHub, Jira, and Linear payloads for manual review, never silent submission.

Coverage stays explicit. Complete, partial, and unknown are product-level states. A zero-finding scan with missing, excluded, truncated, or not-rechecked work is not reported as clean.

What you get, and what you don’t

What we honestly don’t claim.

Trust comes from being precise about the edges. Here is what CodeInspectus is not, said plainly and up front.

See what we don’t claimHide what we don’t claim
  • Not a certificate

    It is not an audit or a pass

    CodeInspectus is not a security audit or a certification.

    It finds real problems. It does not declare your app safe, and a clean run is not a guarantee.

  • Catches a lot, not everything

    No scanner finds every issue

    A clean result means nothing obvious was found, not that nothing is wrong.

    Treat it as a strong first pass, not the last word.

  • Coverage, not compliance

    Compliance mapping is code-level only

    Framework mappings show which code-level controls your findings touch.

    They are drafted with AI and reviewed by one security practitioner, they are not independently audited, and they never mean you pass a framework.

  • A hint, not a verdict

    Prompt-injection is a heuristic

    The AI-specific check for prompt injection is a medium-confidence signal.

    It is reported as a possible weak point, never asserted as certain.

  • Source integrity, not authorship

    Hidden Unicode is not a Claude watermark

    Source-integrity results come from deterministic Unicode properties and exact repository evidence.

    CodeInspectus does not infer Claude, Anthropic, or AI authorship from those characters. Version 3.2 separately reports explicit attribution and supported local C2PA provenance; those records are evidence, not authorship proof. Version 3.3 can remove a selected marker only after you approve an exact plan, with a checkpoint and rollback; media cleanup writes a new copy and keeps the original. Statistical model-watermark detection and pixel, audio, or video watermark removal remain unavailable.

  • Repository evidence, not runtime proof

    Missing controls are not findings

    For supported headers, CSP, session cookies, and Supabase CAPTCHA integration, CodeInspectus separates verified_in_repository, insecure_configuration_found, and not_verifiable_from_repository.

    “Verified” means only that recognized source configuration passed the rule’s narrow literal check, not that runtime behavior or the complete policy is proven. Only explicit insecure repository configuration becomes a vulnerability. It does not call a header missing because it cannot see Cloudflare, Vercel, nginx, or another gateway; it does not infer dashboard CAPTCHA; and it does not claim runtime rate-limit or behavioral-auth coverage.

  • Flagged, with limits

    Trusting user_metadata for access

    Flagged, but it does not trace taint across files or through whole-object aliases.

    If your code decides access from Supabase user_metadata, like if (user.user_metadata.role === 'admin'), CodeInspectus flags it (high severity, medium confidence) because a signed-in user can edit their own user_metadata through Supabase’s auth API and hand themselves that role. Gate privileged logic on the server-only app_metadata instead. The check follows the value inline and across variables within a file; its honest edge is that it does not trace taint across files or through a whole-object user_metadata alias, so those forms can slip past. It also flags a service_role key value in client-reachable code as critical, and a service_role key behind a browser-exposed NEXT_PUBLIC_ prefix as high.

None of this is a disclaimer buried in a footer. It is the point. You should know exactly what a result means before you trust it.

For the technically curious

Now, exactly how it works.

Everything below is for engineers and security folks who want to verify the machine, not just trust it. This console is an illustration of one local scan of code at rest. It is an example, not real output from your code, and not live network monitoring.

codeinspectus_scan offline example scan · illustrative
Code surfacerepo at rest
Severityengines_run 5
critical 1
high 2
medium 3
low 1
info 0
Posture score0–100

59 / 100, severity-weighted, illustrative. not a “% compliant” number

Finding feed7 rows
CI-0001CRITgitleakssrc/lib/payments.ts:42CWE-798
CI-0002HIGHcodeinspectus-aisrc/db/policy.sql:7CWE-863
CI-0003HIGHopengrepsrc/api/query.ts:118CWE-89
CI-0004MEDItrivypackage-lock.jsonCVE-2025-29927
CI-0005MEDIcodeinspectus-aisrc/agent/tools.ts:54CWE-1426
CI-0006MEDIopengrepsrc/utils/render.ts:33CWE-79
CI-0007LOWtrivyinfra/main.tf:21CWE-16
target ./app duration_ms 8420 engines opengrep1.33.1 gitleaks8.30.1 trivy0.76.1 osv-scanner2.7.0 codeinspectus-ai
Dataflow

The architecture, read top to bottom.

For the technically curious, here is exactly what happens on each call. The four open-source engines and the Synvoya engine run locally, their output is normalized and deduplicated into one CWE-keyed shape, mapped to framework controls, and returned. Every step is local. No step opens a socket.

See the architectureHide the architecture
  1. Agent invokes

    An AI coding agent calls a tool over MCP, JSON-RPC across stdio. No HTTP, no daemon.

    in codeinspectus_scan(path)

  2. Engines run local

    Core spawns Opengrep, Gitleaks, Trivy and osv-scanner as subprocesses, plus its own AI-code checks and the Synvoya gap layer.

    out SARIF 2.1.0 + JSON

  3. Normalize

    A parser folds every engine’s SARIF or JSON output into one compact, CWE-keyed schema with severities.

    → cwe findings

  4. Dedup

    Overlapping hits collapse, including the Trivy and Gitleaks secret overlap, so a finding is reported once.

    → unique set

  5. Map controls

    Each finding is tagged CWE to framework control, as honest code-level coverage.

    → framework tags

  6. Return

    The agent receives compact JSON plus a human summary, then drives the fix.

    out findings + summary

The differentiator

The checks generic scanners miss.

Borrowed engines are the commodity floor. The moat is CodeInspectus’s own checks for the failure classes AI-generated code introduces and the repository-integrity risks generic vulnerability scanners do not model, plus a curated detection database that grows weekly.

See the four checksHide the four checks
  • Client-side exposure

    Secrets in the bundle

    Keys and tokens shipped to the browser in client code or build output, where a vault-only mental model says they cannot be.

  • CVE-2025-48757

    Supabase RLS, inverted auth

    The row-level-security failures and inverted authorization that AI scaffolding ships by default. Detected from the code, not a network probe.

  • Heuristic · medium confidence

    Prompt-injection sinks

    Where untrusted text can reach an LLM call. Reported as a potential sink, a heuristic signal at medium confidence, never asserted as certain.

  • Source integrity · exact evidence

    Concealed Unicode in source

    Exact file, line, codepoint column, byte offset, escaped character evidence, confidence, limitations, and a reversible cleanup proposal that your agent can apply only after approval.

Behind these checks sits a curated detection database that grows every week through human-reviewed intake. The managed engines are the floor anyone can stand on. This database is the part you cannot copy by downloading the same binaries.

What we scan for

What CodeInspectus scans for.

126 curated vulnerability detections (72 first-party native rules across sixteen packs, 18 Opengrep-owned SAST rules, 31 Synvoya PHP and Node.js rules, and 5 CodeInspectus-specific Gitleaks rules), plus Gitleaks’ built-in ruleset with 200+ secret & API-key patterns. Separate non-CWE repository-trust capabilities audit concealed Unicode, explicit AI attribution, supported media metadata, and local C2PA provenance. Opengrep, Gitleaks, Trivy, and osv-scanner remain active and additive. Fully local, nothing leaves your machine at scan time.

See every detectionHide the detections

Built for AI-generated code: the checks generic scanners don’t have 29 checks

  • Hardcoded secret shipped in client-side code
  • Secret baked into the built JS bundle
  • Real secret behind a client-visible env prefix (NEXT_PUBLIC_ / VITE_ / PUBLIC_)
  • Supabase service_role key (full DB access, bypasses RLS) in client-reachable code
  • LLM SDK client explicitly allowed to run in the browser, exposing your API key
  • Final effective RLS policy state is fully open with USING (true): the predicate matches every row
  • Public table created with no Row-Level-Security at all
  • RLS checking JWT role/aud instead of the actual user, so access is not scoped to the owner
  • Supabase Edge Function explicitly deployed without platform JWT verification and no visible replacement authentication
  • Over-permissive RLS on storage.objects: bucket files openly accessible
  • Untrusted input reaching an LLM prompt (flags likely prompt-injection sinks)
  • Authz decision trusting client-writable user_metadata (privilege escalation)
  • Model/untrusted output rendered as raw HTML in React (__html): XSS
  • Raw exceptions, stack traces, provider/query details, or internal paths returned to an API client
  • Password hashes, tokens, API keys, or private credentials explicitly returned in an API response
  • Whole request object passed directly to a Prisma, Supabase, or common ORM write without visible validation
  • Passwords, authorization, cookies, tokens, secrets, or auth/payment request bodies written to logs
  • Security response headers explicitly disabled, removed, or configured with an ineffective literal value
  • Production CSP script policy with a bare wildcard or unsafe-eval
  • Auth/session cookies with HttpOnly or Secure explicitly disabled, or SameSite=None without Secure
  • Checked-in Supabase CAPTCHA enablement paired with signup, password/OTP/SSO/Web3 signin, or reset calls missing captchaToken
  • Model-produced tool arguments reaching Node.js shell execution without a visible checked guard
  • General model output reaching JavaScript eval, Function, or import-proven shell-string execution
  • Next.js admin API handlers missing visible authentication or server-side authorization
  • Modern Supabase secret API key exposed in client-reachable source or a shipped browser bundle
  • Authenticated Supabase Edge Function using an RLS-bypassing client without visible server authorization
  • Effective Referrer-Policy explicitly set to unsafe-url
  • Permissions-Policy universally delegating camera, microphone, or geolocation
  • Import-proven Express admin routes missing visible server authentication or authorization

First-party native language, framework, and workflow packs 43 checks

  • Flutter · 6Disabled TLS verification, sensitive SharedPreferences and logs, untrusted WebViews, privileged Supabase keys, and cleartext endpoints
  • Android · 4Debuggable releases, cleartext traffic, production trust of user CAs, and exported FileProviders
  • iOS · 4Global ATS bypasses, insecure domain exceptions, weak TLS policy, and disabled default data protection
  • React Native · 4Sensitive AsyncStorage writes and untrusted, mixed-content, or universal file-origin WebView access
  • Expo · 2Server secrets exposed through public app config and unsigned cleartext production updates
  • Python AI/API · 10Framework secrets, CORS, file/redirect/template sinks, unsafe HTML, FAISS deserialization, LangChain SSRF, prompt injection, and model-tool shell execution
  • Go · 1Official OpenAI tool arguments reaching a recognized os/exec shell invocation
  • Java · 1Official OpenAI tool arguments reaching an actually-started ProcessBuilder or Runtime shell
  • C# · 1Official OpenAI tool arguments reaching an actually-started System.Diagnostics.Process shell
  • PHP · 1OpenAI PHP ecosystem tool arguments reaching exec, system, shell_exec, or passthru
  • Rust · 1async-openai tool arguments reaching recognized process or Docker exec shell vectors
  • Ruby · 1Official OpenAI tool arguments reaching system, exec, IO.popen, or proven Open3 shell execution
  • Firebase · 3Literal unconditional public writes in Firestore, Cloud Storage, and Realtime Database rules
  • GitHub Actions · 2Direct untrusted expression injection and exact pull_request_target checkout-and-execute chains
  • JS baseline · 2Weak hashes and deprecated or broken ciphers, reconciled against still-active Opengrep fallbacks

Industry-standard code security 18 Opengrep-owned SAST checks

  • SQL injection: string-built query (JS/TS)
  • SQL injection: string-built query (Python)
  • Command injection: shell command from string (JS/TS)
  • Command injection: subprocess shell=True (Python)
  • eval / dynamic code execution (JS/TS)
  • eval / exec of non-literal (Python)
  • NoSQL injection from request data
  • Path traversal: filesystem path from request input
  • DOM XSS: untrusted data into innerHTML/outerHTML
  • SSRF: outbound request URL from request input
  • Weak hash (MD5 / SHA-1): Python
  • Insecure randomness: Math.random() for a security value
  • JWT alg:none: signature-check bypass
  • Invalid CORS wildcard-plus-credentials configuration: browsers reject credentialed sharing
  • CORS accepts or reflects an arbitrary origin while credentials are enabled
  • Cookie explicitly configured with httpOnly:false
  • Insecure deserialization (Node)
  • Insecure deserialization (Python)

And Gitleaks’ built-in 200+ pattern secret ruleset

Runs Gitleaks’ built-in ruleset on every secret scan, covering committed API keys and secrets for Anthropic, OpenAI, Google/Gemini, AWS, GitHub, GitLab, Stripe, Supabase, Cohere, Perplexity, Hugging Face, Azure, with generic high-entropy and private-key detection as a fallback. A repo’s .gitleaks.toml and inline allow comments cannot replace these checks. A .gitleaksignore file can still suppress individual findings; when one is present, CodeInspectus warns that secret coverage is unverified.

Native packs activate only on positive language or framework evidence and report skipped, partial, unavailable, and not-applicable coverage explicitly. Supported runtime controls report one of three states: verified in repository, explicit insecure configuration found, or not verifiable from repository. Repository-trust output keeps source-integrity, explicit-attribution, and content-provenance artifacts separate from vulnerabilities and reports each capability as ran, partial, or not_applicable. C2PA validation reports partial coverage when the optional official validator is absent. Statistical model-watermark checks remain unavailable, so an empty result is not an authorship or provenance verdict. Missing headers, dashboard-only CAPTCHA, gateway rate limits, conflicts, runtime overrides, and runtime mobile behavior are not vulnerability findings. Every scan runs on your own machine. Nothing is uploaded.

Integrity layer

Every binary is pinned and verified.

See how each binary is verifiedHide the verification details
  • opengrep sha256: a17c…c3e2d verified
  • gitleaks sha256: ba52…0e84f verified
  • trivy sha256: 5c03…35e8d verified
  • osv-scanner sha256: d492…df70b verified
  • unpinned no hash on record refused
Supply chain

Why hash-verify before exec.

Trivy was supply-chain-compromised twice in early 2026. A downloaded scanner engine is an attack surface, so CodeInspectus treats every engine binary as untrusted until proven.

Each binary is SHA-pinned in a locked manifest and hash-verified before it runs. A binary that is unpinned or whose hash does not match is refused. It does not execute.

CodeInspectus can bootstrap its own SHA-pinned Cosign verifier after approval, so users do not need to install Cosign separately. Publisher verification still fails closed.

Coverage, not certification

Compliance as code-level control coverage.

Each finding’s CWE maps to controls across frameworks. The numbers below count how many of each framework’s code-visible controls CodeInspectus’s detectors can reach. It is a coverage view, never a verdict.

See coverage by frameworkHide coverage by framework
OWASP Top 10 · 2021 detectors map to 8 of 8 code-visible controls
OWASP LLM Top 10 · 2025 detectors map to 2 of 4 code-visible controls
NIST CSF 2.0 detectors map to 5 of 5 code-visible controls
ISO/IEC 27001:2022 detectors map to 6 of 7 code-visible controls
SOC 2 detectors map to 3 of 5 code-visible controls
CIS v8.1 detectors map to 6 of 7 code-visible controls
Essential Eight 1 of 1 code-visible control

Essential Eight is shown as a footnote, not a coverage panel: only Patch Applications is meaningfully code-evidenced (1 of 8 mitigations). This is not an Essential Eight assessment.

Built in the open

Review our work. Help us get it right.

CodeInspectus is a solo, free, open-source project by one security practitioner under the Synvoya name. There is no company behind it, which is exactly why outside eyes matter.

See how to help and where to lookHide how to help

If you write code or work in security, your scrutiny is the contribution. The detection rules and the compliance mappings are both open to review, and false-positive reports are as welcome as new rules.

The compliance mappings especially. They are AI-drafted and reviewed by the maintainer, but not yet independently verified. Of the 96 framework-control mappings, zero have been confirmed by an outside contributor. Moving one to community-verified takes a quote from the control’s primary source and your basis. We report the count honestly rather than hide it.

Workflow: fork → branch → pull request → maintainer review → merge

Deep detail

For those who want to verify everything.

The full set, collapsed by default. Open what you need: the enforced security properties, every detection rule, the exact engine versions, and how this is built.

Security properties CodeInspectus enforces

guardrails

These are the guarantees enforced in the code and the lockfile, drawn from the engine manifest, the source guardrail comments, the README’s honest-claims, and the verify checklist. Each is a property the tool holds itself to, not a marketing line.

scans never write

Reads and reports; edits only on approval

Scanning never edits or deletes your source code or repository. The only file-changing tools are the optional cleanup tools: they act on an exact plan you approve, checkpoint first, and can roll back. Your agent applies vulnerability fixes; the SBOM goes to a managed directory by default (or an absolute path you choose) and never replaces another file.

README · no tool writes your code
redaction

Secret values are redacted

Output carries the type, location, and a redacted preview only. A raw secret value is never written back into any result.

eval E03 · verify.md
verify-before-exec

SHA-pinned, checked before exec

Every engine binary’s SHA256 is verified against the lockfile before it runs. An unpinned or mismatched binary is refused.

engines.lock.json · src/engines/resolve.ts
fail-closed

Signature verification fails closed

Publisher verification is mandatory: Cosign for Opengrep, checksums for Gitleaks, checksums with a Sigstore signature for Trivy, and checksums with Cosign-verified SLSA provenance for osv-scanner. The Cosign verifier is itself SHA-pinned and bootstrapped only after approval. If verification fails, the engine does not run.

engines.lock.json sigstore_identities
zero egress

No network or telemetry from scans

Trivy runs with offline flags and the scan path opens no socket. The scanner has no account or sign-in and sends no usage telemetry.

README · src/engines/trivy.ts
coverage-only

Compliance is code-level coverage

Output never says “% compliant” or “you pass”. It always shows the code-visible denominator and the standing disclaimer.

verify.md guardrail spot-checks
dedup

Cross-engine secret dedup

Overlapping hits collapse, including the Trivy and Gitleaks secret overlap, so a single finding is reported once.

README dataflow
no forks

Engines orchestrated, never forked

Approved setup downloads official engine binaries from upstream, and CodeInspectus calls them as local subprocesses after verification. It does not fork or patch them.

README
pure transport

stdout is pure JSON-RPC

The stdio MCP transport keeps stdout pure JSON-RPC; all human text goes to stderr. No stray console output leaks into the protocol.

src/logger.ts · src/index.ts
ai-scope

AI checks stay in scope

The custom AI checks target the AI-code and framework failure modes the generic engines miss. Generic SAST is left to the engines, not duplicated.

detection-db/manifest.json

Full detection rule catalogue

126 curated detections

CodeInspectus’s curated manifest: 72 first-party native rules across sixteen packs, 18 Opengrep-owned security-baseline rules, 31 Synvoya PHP and Node.js rules, and 5 Gitleaks secret rules. All 20 Opengrep YAML rules remain active; the two native JavaScript baseline rules reconcile exact results and fall back to Opengrep if native analysis is unavailable. Generic engine corpora run alongside these and are not listed here.

AI-code checks · engine codeinspectus-ai · 29

What it catchesRule idCWE
Hard-coded secret in client-reachable codeci-ai-client-hardcoded-secretCWE-798 / 312
Secret compiled into the shipped bundleci-ai-secret-in-bundleCWE-798 / 312
Secret exposed via a client-visible env prefixci-ai-public-env-secretCWE-798 / 312
Supabase service_role key in client codeci-ai-supabase-service-role-clientCWE-798 / 285
Supabase secret API key in client-reachable codeci-ai-supabase-secret-key-clientCWE-798 / 285
LLM SDK set to allow browser useci-ai-llm-key-browser-exposedCWE-798 / 312
Final effective RLS policy state is fully open with USING (true)ci-ai-rls-using-trueCWE-863 / 285
Public table created without Row Level Securityci-ai-rls-missingCWE-862 / 285
RLS policy tests role instead of user identityci-ai-rls-inverted-authCWE-863
Explicitly anonymous Supabase Edge Function lacks visible replacement authenticationci-ai-edge-fn-no-authCWE-862 / 285
Authenticated Edge Function uses an RLS-bypassing client without authorizationci-ai-edge-fn-privileged-no-authzCWE-863 / 285
Permissive RLS on storage objectsci-ai-storage-rls-publicCWE-863 / 285
Potential prompt-injection sink (heuristic)ci-ai-prompt-injection-sinkCWE-1427
Authorization decision trusts client-writable user_metadataci-ai-client-metadata-authzCWE-639 / 284 / 863
Untrusted or model output rendered as raw HTMLci-ai-llm-output-dangerous-htmlCWE-79 / 116
Internal error detail returned to an API clientci-ai-client-error-leakCWE-209
Sensitive field explicitly returned in an API responseci-ai-sensitive-api-responseCWE-201
Unvalidated whole request object passed to a database writeci-ai-unvalidated-request-writeCWE-915
Sensitive request data written to logsci-ai-sensitive-logCWE-532
Security response header explicitly disabled or ineffectiveci-ai-security-header-disabledCWE-693
Production CSP explicitly allows unsafe script executionci-ai-unsafe-production-cspCWE-693
Referrer-Policy explicitly uses unsafe-urlci-ai-unsafe-referrer-policyCWE-200 / 693
Permissions-Policy universally delegates a sensitive featureci-ai-overbroad-permissions-policyCWE-942 / 693
Auth/session cookie explicitly uses insecure attributesci-ai-insecure-session-cookieCWE-1004 / 614
CAPTCHA-enabled Supabase auth call omits captchaTokenci-ai-supabase-captcha-token-missingCWE-693
Model-produced tool argument reaches Node.js shell executionci-ai-llm-tool-argument-command-executionCWE-78 / 1426
Model output reaches dynamic code or shell-string executionci-ai-llm-output-dynamic-executionCWE-94 / 78 / 1426
Next.js admin API route lacks visible authentication or authorizationci-ai-nextjs-admin-route-no-authzCWE-862 / 863 / 306
Express admin API route lacks visible server authentication or authorizationci-ai-express-admin-route-no-authzCWE-862 / 863

Additional first-party native packs · engine codeinspectus-ai · 43

What it catchesRule idCWE
Flutter accepts invalid TLS certificatesci-flutter-tls-verification-disabledCWE-295
Sensitive value stored in SharedPreferencesci-flutter-sensitive-shared-preferencesCWE-312
Untrusted content loaded into a Flutter WebViewci-flutter-webview-untrusted-contentCWE-20 / 346
Sensitive data written to Flutter logsci-flutter-sensitive-logCWE-532
Privileged Supabase key exposed in a Flutter clientci-flutter-supabase-privileged-key-clientCWE-798 / 312 / 285
Cleartext production connection in Flutterci-flutter-cleartext-networkCWE-319
Android release explicitly enables debuggingci-android-debuggable-releaseCWE-489
Android production configuration permits cleartext trafficci-android-cleartext-trafficCWE-319
Android production configuration trusts user-added CAsci-android-user-ca-trustCWE-295
AndroidX FileProvider is exportedci-android-exported-file-providerCWE-926
iOS ATS permits arbitrary loads globallyci-ios-ats-global-arbitrary-loadsCWE-319
iOS ATS permits insecure loads for a production domainci-ios-ats-insecure-domain-exceptionCWE-319
iOS ATS weakens TLS for a production domainci-ios-ats-weak-tlsCWE-327
iOS default data protection is disabledci-ios-data-protection-disabledCWE-311
Sensitive credential stored in React Native AsyncStorageci-react-native-sensitive-async-storageCWE-312
Untrusted content loaded into a React Native WebViewci-react-native-webview-untrusted-contentCWE-20 / 346
React Native WebView permits mixed contentci-react-native-webview-mixed-contentCWE-319
File-backed WebView permits universal-origin accessci-react-native-webview-universal-file-accessCWE-200 / 942
Server secret exposed through public Expo configci-expo-secret-in-public-configCWE-798 / 312
Expo updates use cleartext transport without code signingci-expo-unsigned-cleartext-updatesCWE-494 / 319
Hardcoded Python framework signing secretci-python-hardcoded-signing-secretCWE-798 / 321
Python credentialed CORS permits every originci-python-credentialed-cors-all-originsCWE-942 / 346
Request-controlled path reaches a Python file responseci-python-untrusted-file-responseCWE-22 / 73
Request input controls a Python redirect targetci-python-untrusted-redirectCWE-601
Request input controls Python template sourceci-python-untrusted-template-sourceCWE-1336 / 94
Python LLM output reaches an unsafe HTML responseci-python-llm-output-dangerous-htmlCWE-79 / 116
LangChain FAISS load enables dangerous pickle deserializationci-python-faiss-dangerous-deserializationCWE-502
Request-derived URL reaches LangChain WebBaseLoaderci-python-langchain-web-loader-ssrfCWE-918
Request input reaches privileged Python LLM instructionsci-python-prompt-injection-sinkCWE-1427
Model tool arguments reach a Python shell APIci-python-llm-tool-argument-command-executionCWE-78 / 1426
OpenAI Go tool arguments reach os/exec shell invocationci-go-llm-tool-argument-command-executionCWE-78 / 1426
OpenAI Java tool arguments reach a started shell processci-java-llm-tool-argument-command-executionCWE-78 / 1426
OpenAI .NET tool arguments reach a started shell processci-csharp-llm-tool-argument-command-executionCWE-78 / 1426
OpenAI PHP tool arguments reach command executionci-php-llm-tool-argument-command-executionCWE-78 / 1426
async-openai tool arguments reach Rust process executionci-rust-llm-tool-argument-command-executionCWE-78 / 1426
OpenAI Ruby tool arguments reach command executionci-ruby-llm-tool-argument-command-executionCWE-78 / 1426
Firestore rules grant unconditional public writesci-firebase-firestore-public-writeCWE-862 / 285
Cloud Storage rules grant unconditional public writesci-firebase-storage-public-writeCWE-862 / 285
Realtime Database rules grant unconditional public writesci-firebase-realtime-database-public-writeCWE-862 / 285
Attacker-controlled GitHub context reaches a shell stepci-github-actions-untrusted-expression-commandCWE-78 / 94
Privileged pull_request_target executes untrusted PR codeci-github-actions-pwn-requestCWE-94 / 829
JavaScript/TypeScript uses MD5 or SHA-1 for hashingci-baseline-weak-hashCWE-327
JavaScript/TypeScript uses a deprecated or weak cipherci-baseline-weak-cipherCWE-327

Opengrep security-baseline · 18 owned + 2 native-reconciled fallbacks

What it catchesRule idCWE
SQL injection via string-built query (JS/TS)ci-baseline-sql-injection-string-buildCWE-89
SQL injection via string-built query (Python)ci-baseline-sql-injection-pythonCWE-89
Command injection via shell string (JS/TS)ci-baseline-command-injectionCWE-77
Command injection via shell=True (Python)ci-baseline-command-injection-pythonCWE-77
Dynamic code evaluation of non-literal (JS/TS)ci-baseline-dangerous-evalCWE-94
Dynamic eval/exec of non-literal (Python)ci-baseline-eval-pythonCWE-94
NoSQL injection from request dataci-baseline-nosql-injectionCWE-943
Path traversal from request inputci-baseline-path-traversalCWE-22
DOM XSS via innerHTML/outerHTML sinkci-baseline-dom-xss-innerhtmlCWE-79
SSRF: outbound request URL from inputci-baseline-ssrf-request-from-inputCWE-918
Weak hash algorithm (Python)ci-baseline-weak-hash-pythonCWE-327
Math.random() for a security valueci-baseline-insecure-random-securityCWE-338
JWT verification accepts alg “none”ci-baseline-jwt-alg-noneCWE-347
Invalid CORS wildcard origin with credentialsci-baseline-cors-wildcard-credentialsCWE-942
Credentialed CORS accepts or reflects arbitrary originsci-baseline-cors-arbitrary-origin-credentialsCWE-942
Session cookie explicitly disables HttpOnlyci-baseline-insecure-cookieCWE-1004
Insecure deserialization (node unserialize)ci-baseline-insecure-deserialization-nodeCWE-502
Insecure deserialization (untrusted loader)ci-baseline-insecure-deserialization-pythonCWE-502

Synvoya PHP · engine opengrep · 19

What it catchesRule idCWE
SQL injection from request input (PHP, Laravel, Symfony, WordPress)syn-php-sql-injectionCWE-89
OS command injection from request input (PHP)syn-php-command-injectionCWE-78
Code injection: request input evaluated or chooses the function (PHP)syn-php-code-injectionCWE-94
unserialize() of request input (PHP object injection)syn-php-unserialize-inputCWE-502
Server-side request forgery: request input chooses the outgoing host (PHP)syn-php-ssrfCWE-918
extract()/parse_str() of request input overwrites variables (PHP)syn-php-extract-request-inputCWE-621
Upload stored under the client’s file name or extension (PHP)syn-php-upload-client-filenameCWE-434
Blade {!! !!} prints request input unescaped (Laravel)syn-php-blade-raw-request-outputCWE-79
Password hashed with MD5/SHA-1 (PHP)syn-php-weak-password-hashCWE-916
TLS certificate verification disabled (PHP)syn-php-tls-verification-disabledCWE-295
APP_DEBUG=true in a deployable .env file (Laravel, Symfony)syn-php-env-app-debug-enabledCWE-489
Symfony production env or config enables dev modesyn-php-symfony-prod-debugCWE-489
Symfony front controller boots dev/debug unconditionallysyn-php-symfony-front-controller-debugCWE-489
WordPress REST write route open to everyone with no handler checksyn-php-wp-rest-route-public-writeCWE-862
WordPress admin-ajax handler changes data without nonce or capability checksyn-php-wp-ajax-handler-no-auth-checkCWE-862
wp-config.php displays PHP errors to visitorssyn-php-wp-debug-display-enabledCWE-209
File inclusion from request input (PHP)syn-php-file-inclusionCWE-98
phar:// wrapper reachable through a request path (PHP before 8.0)syn-php-phar-path-inputCWE-502
Security token from a predictable generator (PHP)syn-php-insecure-random-tokenCWE-338

Synvoya Node.js · engine opengrep · 12

What it catchesRule idCWE
jsonwebtoken verify() without an algorithms allow-listsyn-node-jwt-verify-no-algorithmsCWE-347
Request token read with jsonwebtoken decode() and never verifiedsyn-node-jwt-decode-without-verifyCWE-345
Session middleware cookie with secure/httpOnly disabledsyn-node-session-cookie-insecureCWE-614 / 1004
Global NestJS ValidationPipe without whitelistsyn-node-nestjs-validation-pipe-no-whitelistCWE-915
Framework trusts every proxy hop unconditionallysyn-node-trust-proxy-unconditionalCWE-348
Placeholder secret in a deploy filesyn-node-placeholder-secret-deployCWE-1188 / 798
Deserializer that can rebuild functions (node-serialize, js-yaml full schema)syn-node-unsafe-deserializationCWE-502
Zip slip: archive entry name written outside the extraction foldersyn-node-zip-slipCWE-22
Command injection: request input reaches a shell command (JS/TS)syn-node-command-injectionCWE-78
Code injection: request input compiled by node:vm or a string timersyn-node-code-injection-vmCWE-94
Prototype pollution: request input chooses a nested property namesyn-node-prototype-pollution-keyCWE-1321
Prototype pollution: recursive merge helper without __proto__ guardsyn-node-prototype-pollution-mergeCWE-1321

Gitleaks secrets · engine gitleaks · 5

What it catchesRule idCWE
Stripe live-mode secret keycodeinspectus-stripe-live-secretCWE-798
Supabase service_role JWTcodeinspectus-supabase-service-roleCWE-798
Supabase secret API keycodeinspectus-supabase-secret-keyCWE-798
Anthropic API keycodeinspectus-anthropic-keyCWE-798
Laravel APP_KEY in a deployable .env filecodeinspectus-laravel-app-keyCWE-798

Engine versions & verification

SHA-pinned

The exact pinned versions and how each is verified before execution. SHA256 values shown are the darwin-arm64 pins; the full per-platform set lives in engines.lock.json.

EngineVersionVerified bySHA256 (darwin-arm64)
Opengrep1.33.1cosigna17c1881…16bc3e2d
Gitleaks8.30.1checksumsba52fb1b…bc0e84f
Trivy0.76.1checksums + sigstore5c03401c…05535e8d
osv-scanner2.7.0checksums + SLSA provenanced4926ef8…16bdf70b

Re-verify any time with npx codeinspectus verify-engines. A null pin, or a hash that does not match, means the binary will not run on that platform.

How this tool is built

auditable

The repository is generated from an auditable, allow-list seed and built end-to-end with a clean type-check, a build step, and a regression eval suite over fixtures. The full story, including what is and is not published, is written down.

What’s new

Every release, in plain words.

CodeInspectus 4.0.0 Latest

Five engines, with a focus on PHP and Node.js.
  • Five engines. Four trusted open-source scanners, plus the Synvoya engine, which is ours.
  • Synvoya engine. 330 recent advisories, including 87 for Node.js and 39 for PHP, checked offline against the versions your project declares.
  • 31 new rules for PHP and Node.js code: 19 for PHP, 12 for Node.js.
  • Google’s osv-scanner joins Opengrep, Gitleaks and Trivy to check lockfiles, fully offline.
  • Quieter results. License findings are opt-in, generic secrets in test and example files are lowered, and vendored code is skipped and listed.
  • Honest coverage. Files no engine reads are listed as gaps, never called clean.

CodeInspectus 3.3.2

A dependency security patch.
  • An updated TOML parser, so a crafted file in a scanned project can no longer stall a scan.
  • A newer MCP SDK and a refreshed lockfile. Those advisories affect web transports; CodeInspectus only talks over stdio.
  • A fresh Dart and Flutter advisory snapshot: 12 advisories across 11 packages.

CodeInspectus 3.3.1

Security hardening and fixes.
  • Scan and cleanup tools refuse an empty or relative path, so nothing scans the wrong folder by accident.
  • Secret values in configuration-file snippets are masked.
  • A crafted file name can no longer fake a line, such as a fake critical finding, in text output.
  • Triage notes stay with a finding that only moved down the file.

CodeInspectus 3.3.0

Verified cleanup you approve, with rollback.
  • Three new tools plan, apply and roll back a cleanup. Nothing changes until you approve the exact plan.
  • Media cleanup writes a cleaned copy and keeps the original file.
  • Git history and legal, licensing and compliance records are never touched.
  • Secret values are scrubbed from snippets in every output, and a scanned project’s Git settings can no longer run programs.

CodeInspectus 3.2.0

AI attribution and Content Credentials checks.
  • Finds explicit AI-attribution notes in file headers, Git co-author lines and image metadata. They show a claim exists, not who wrote the code.
  • Checks C2PA Content Credentials on your computer with the official validator, an optional add-on.
  • Still read-only, with no network access during a scan.

CodeInspectus 3.1.0

Hidden Unicode and source-integrity checks.
  • Finds hidden Unicode that can make code read differently from how it runs: direction overrides, zero-width characters and lookalike letters.
  • Every finding gives the exact file, line and column.
  • A rescan calls a marker resolved only when the check fully ran again.
  • Nothing is removed for you. Any fix needs your approval and a rescan.

CodeInspectus 3.0.0

Groundwork for trust checks beyond vulnerabilities.
  • A new versioned report format for trust checks that are not vulnerabilities, such as hidden characters and provenance.
  • Those checks show as unavailable until each one ships, and zero results is never called clean.
  • Not published to npm on its own; it first shipped inside 3.1.0.

Full changelog on GitHub

Architecture and console, described

An AI coding agent calls CodeInspectus over MCP using JSON-RPC across stdio, or a developer and CI job invoke the same local core through the local CLI. The CodeInspectus core runs four separately downloaded engines as local subprocesses, Opengrep for static analysis, Gitleaks for secrets, Trivy for dependency CVEs, infrastructure misconfiguration, secrets, opt-in license checks and SBOM, and osv-scanner for offline OSV.dev dependency matching, plus its own AI-code-specific checks, the Synvoya gap layer for recent advisories and end-of-life runtimes, and separate non-CWE repository-trust capabilities for concealed Unicode, explicit AI attribution, supported media metadata, and local C2PA provenance. Each engine emits SARIF 2.1.0 or JSON. A normalizer parses that output into compact versioned vulnerability and repository-trust output, deduplicates overlapping findings including the Trivy and Gitleaks secret overlap, and a compliance mapper tags each finding from CWE to framework controls. The core returns compact JSON and a human summary to the agent. Every step runs locally on your machine. There is no network egress at scan time.

The console is an illustration of a single local scan of code at rest. It reads seven findings: one critical, two high, three medium and one low. The severity-weighted posture score is 59 out of 100, which is a distinct console reading and not a compliance percentage. The console does not perform live network monitoring.