How to scan a local project, review license findings, and run CVE analysis
Prefer a guided walkthrough? The video below shows the full workflow end to end.
Before purchasing a license, run Compatibility Check from the startup dialog to confirm OSSScan's tools are installed and to generate your machine fingerprint.
The Compatibility Check dialog includes a Check Project Coverage… button — no license required. Use it to test a project folder, an existing SBOM (SPDX or CycloneDX), or both, and see whether OSSScan will produce Strong, Partial, or Limited coverage before you commit to a purchase.
If you check both a folder and an SBOM for the same project, OSSScan grades each independently so you can compare them side by side, useful for deciding whether to scan the source directly or bring your own SBOM instead.
Think of it as two separate questions: Compatibility Check asks "are the tools installed on this machine?" and Check Project Coverage asks "will those tools give good results for this specific project?"
After a license is installed, Check Project Coverage is also available any time from Help → Check Project Coverage… in the main app menu.
OSSScan uses external command-line tools for SBOM and CVE analysis:
These tools are not bundled with OSSScan — you install them once on your machine. This keeps OSSScan smaller, lets you update tools independently, and avoids redistributing the tools' full dependency trees.
The tooling strip at the top of the main window summarizes tool health. Click a chip to open the tooling drawer.
Installing Syft and Grype:
Syft
and
Grype.
If you use Homebrew on macOS, the common commands are brew install syft and brew install grype.
On Windows with WinGet, use winget install Anchore.Syft --source winget and winget install Anchore.Grype --source winget.
After installing, run syft version and grype version once in PowerShell — this lets Windows Defender pre-scan the new binaries so OSSScan detects them immediately.
The Anchore pages start with a Unix-style curl | sh example, so on Windows you should scroll down to the WinGet section instead.
Separately, on Windows, Defender's real-time scanning of every file read during a folder scan can slow large scans. After you pick a folder, OSSScan offers the exact
Add-MpPreference -ExclusionPath '<folder>' command (run in an Administrator PowerShell) to exclude it — this affects scan speed only, not results. Loading an SBOM is unaffected. See the FAQ for details.
brew upgrade syft and brew upgrade grype.During OSSScan development, we ran a deep scan of OSSScan itself. When Syft or Grype were bundled inside the application, OSSScan (and other compliance tools) surfaced copyleft‑licensed components embedded inside those third‑party binaries. These findings came from the compiled dependency trees of Syft and Grype—not from OSSScan's own code.
This experience is a good example of why OSSScan exists at all: to give developers clear insight into the open‑source components they rely on and the licensing risks that may be hidden inside them.
Bundling Syft or Grype would expand OSSScan's redistribution scope and could trigger automated "copyleft risk" alerts in customer environments. To keep OSSScan's distribution clean and to give customers full control over which versions they install and approve, OSSScan now treats Syft and Grype as external, user‑installed tools.
This approach is common in developer tools. For example, VS Code typically does not bundle Git (which is GPL‑licensed). Instead, it detects Git on the system and prompts the user to install it. OSSScan follows the same pattern.
Important: This is an implementation and distribution choice, not legal advice. Copyleft obligations depend on the specific licenses involved, how software is combined and distributed, and your jurisdiction. For release or compliance decisions, consult qualified counsel.
OSSScan uses a single license type. A valid license unlocks the full feature set.
Licenses are machine-bound. When requesting a license, you'll send a Machine fingerprint generated by OSSScan on the computer you intend to run OSSScan on.
The machine fingerprint is a pseudonymous device identifier generated locally by OSSScan. On supported platforms (macOS and Windows), it is derived from an OS-provided machine identifier and then hashed so OSSScan does not need to send or store the underlying raw identifier. It does not include the contents of your files, scan results, code, contacts, or browsing history. (Note: device identifiers may still be considered "personal data" under GDPR.)
If OSSScan cannot generate a machine fingerprint on your computer, it cannot issue or validate a machine-bound license for that computer. In that case, run Compatibility Check to see the fingerprint error, then try a different machine (or contact info@ossscan.com if you believe the error is unexpected).
license.json, install it using the startup dialog (Install License…) or copy it into the userData folder shown by Show Folder.Tip: If OSSScan won't start because no license is installed, the startup license dialog shows your machine fingerprint and includes a Copy Fingerprint button. You can also click Compatibility Check… and use Copy fingerprint there.
If you replace/rebuild the machine (your "system of record" changes) the fingerprint will change. In that case OSSScan will ask you to contact Jim@OSSScan.com to re-issue a license for the new machine.
Renewing before expiry: click Buy a License… again starting 2 days before your current license expires (using the same fingerprint) and any days still remaining are added on top of the new license for free. Only one purchase can be awaiting download per fingerprint at a time. See the FAQ for details.
OSSScan shows the Terms of Use once per license on first launch. You must accept to proceed. If the Terms text changes in a later version you may be prompted again. Declining quits the app.
Before scanning, decide how OSSScan should handle outbound network calls made by the tool processes (Syft, Grype, ScanCode). The network isolation setting is shown in the scan options panel before every scan.
In both modes, every connection attempt made by a tool process is logged. The blocked-call log is shown after the scan and can be exported. To disable isolation entirely, uncheck the network isolation checkbox in the scan options panel.
See the Security page for full details on what is monitored and why.
Separately from this runtime control, we also periodically review the published Syft, Grype, and ScanCode source code itself for any path that could transmit scanned file contents off-machine. Request a copy of the latest dated report at info@ossscan.com.
Note: Scanning requires Syft. If the Syft chip in the tooling strip shows Syft is missing (or unavailable), OSSScan will keep scanning disabled until Syft is installed and detected. Click the Syft chip to open the tooling drawer for install/update guidance and a Re-check button.
If you already have an SBOM — generated by OSSScan, Syft, Trivy, or any other tool — you can load it directly instead of scanning a source directory. This lets you run CVE scanning and license analysis on SBOMs from CI/CD pipelines, vendor-supplied SBOMs, or any other external source without needing the original source code. Your source code never leaves your machine.
Click Load SBOM… and select a JSON file. OSSScan accepts:
OSSScan auto-detects the format. CycloneDX files are converted to the internal SPDX representation automatically — no manual steps required. All loaded packages are tagged with an External SBOM provenance badge in the Licenses table so you can see at a glance that they came from an imported file rather than a fresh scan.
After loading, you can:
Limitation: Copyleft analysis (import/reference scanning) and ScanCode-based license enrichment require the original source files on disk. They will have limited or no evidence when you load an SBOM without the source tree. Deep Enrich can still improve license coverage using package coordinates alone.
OSSScan loads CycloneDX JSON only — CycloneDX XML (recognizable by a
<bom> root element instead of a bomFormat field) is not currently supported.
Convert it to JSON first using the official, free
CycloneDX CLI tool (Apache-2.0, native binaries for macOS/Windows/Linux):
brew install cyclonedx-cli.
On Windows, download the cyclonedx-cli binary for your platform from the
GitHub releases page and put it on your PATH.
cyclonedx convert --input-file bom.xml --output-file bom.json --output-format jsonbom.json into OSSScan using Load SBOM….
This runs entirely on your machine — no data leaves it. To convert several files at once, repeat the command for each .xml file (or loop over them in your shell).
The license quality in OSSScan depends entirely on what the SBOM generator included. Based on testing, the two generators that consistently produce high license coverage are:
GitHub builds a dependency graph for every repository and can export it as an SPDX SBOM with one click. No local tools needed — works from your browser.
.json file into OSSScan using Load SBOM…Note: GitHub's SBOM API can time out for very large repositories (>4,000 dependencies). If the export fails, use cdxgen below instead.
cdxgen generates a CycloneDX SBOM locally from your project files.
It requires Node.js but does not need to be installed separately —
the npx command downloads and runs it automatically.
Open a terminal in your project folder and run:
npx @cyclonedx/cdxgen . -o sbom.json
Then load sbom.json into OSSScan using Load SBOM…
cdxgen auto-detects your project type (npm, Maven, Go, Rust, Python, etc.).
For best results, ensure your dependencies are already installed
(e.g. run npm install or go mod download first).
These platforms don't have a one-click SBOM export, but you can generate one in your CI pipeline using cdxgen and download the artifact:
npx @cyclonedx/cdxgen . -o sbom.json
and saves sbom.json as a pipeline artifact.
Tip: Once you have the SBOM file from your pipeline, download it and load it into OSSScan — no source code access needed.
Use --load-sbom <file> instead of --scan <dir>.
The two flags are mutually exclusive — the CLI will reject a command that specifies both and prompt you to fix it.
OSSScan --headless --load-sbom /path/to/bom.json --out /path/to/output --license-report --cve-scan --cve-report
Syft is not required (and not invoked) when using --load-sbom.
Grype is still required for CVE scanning. Output files are named using the SBOM filename as the base (for example bom.imported.license-report.html).
The --ui mode also supports --load-sbom — OSSScan will open the UI, load the file automatically, and display the results:
OSSScan --ui --load-sbom /path/to/bom.json --out /path/to/output --license-report --cve-scan --cve-report
OSSScan always starts by generating an SBOM and baseline license data using Syft.
Syft is excellent at reading ecosystem manifests (for example package.json, go.mod, NuGet / Maven metadata)
and producing a consistent package inventory.
Deep mode is designed to reduce NOASSERTION / unknown licenses by adding two additional steps:
Examples of cases ScanCode can help with that metadata approaches typically do not:
LICENSE/COPYING file).These sound similar, but they're used at different times:
https://api.deps.dev using package coordinates (name + version from PURLs). No source code or file contents are transmitted.When should you use Deep Enrich?
Rule of thumb: run Deep Enrich when the SBOM knows "what it is" (coordinates) but not "what it's licensed under".
OSSScan's dependency inventory comes primarily from Syft. That means OSSScan can usually capture transitive and deeply nested dependencies when they are exposed through manifests, lockfiles, or other package-manager metadata that Syft understands.
Light scan is not limited to top-level packages. It still uses Syft to build the dependency inventory. What Light skips are the slower license-enrichment layers.
Deep scan starts from the same Syft inventory, then adds extra work to resolve more unknown licenses through registry lookups, ClearlyDefined, and local ScanCode analysis. In practice, Deep usually improves license coverage more than raw dependency depth.
Limitation: if a dependency is hidden inside generated output, vendored source, or a compiled binary rather than normal package metadata, OSSScan may not be able to inventory it as a standard package.
Sometimes the difference is not dependency depth, but evidence quality. Light relies mostly on Syft's package inventory and declared metadata. Deep adds stronger evidence sources, including registry lookups and local ScanCode analysis.
That means Deep can sometimes surface copyleft obligations hidden inside bundled tool payloads, vendored source, packaged artifacts, or local license files that are not obvious from manifest-level metadata alone. In those cases, Deep did not necessarily discover “more transitive levels” so much as it found better local evidence for what was already on disk.
Audit mode is intentionally slow: it runs ScanCode broadly across packages (not just unknowns) so you can spot mismatches. Instead of replacing Syft/ClearlyDefined results, it records when ScanCode agrees or disagrees and shows an Audit — License Disagreements section in the Licenses tab.
Why disagreements can happen:
Audit is best used for due diligence or release sign-off. For day-to-day scanning, Light or Deep is usually the better tradeoff.
OSSScan analyzes the directory you select and generates an SBOM and license report from the files present in that directory. OSSScan does not clean, rewrite, or reinterpret your project before scanning; it evaluates the scan target as provided.
A source scan is for understanding your project's source files and declared dependencies during development. Use this when you want to review dependency-level license signals, source-tree composition, or what your project appears to depend on before packaging.
For the clearest source-level picture, scan a directory that does not also contain generated build outputs such as dist/, build/, out/, or target/.
Those outputs can add bundled or generated components that do not reflect the source dependency graph by itself.
AI coding tools such as Claude Code, GitHub Copilot, and Cursor create a hidden working directory inside your project folder (for example .claude/, .copilot/).
If those directories are present when you scan, OSSScan will include them and you may see duplicated packages in your results.
Remove any AI tool working directories from the scan root before scanning to avoid this.
An artifact scan is for understanding the files you actually ship: the built application, package, installer, container image contents, or other distribution output. Use this when you want to review what is bundled, embedded, or otherwise present in the delivered product.
For dependency analysis or development review, scan a clean source tree. For distribution review — understanding what is actually included in the package or release — scan the built artifact you intend to ship. Many teams run both.
This is an informational observation about scan coverage, not legal advice. What matters for your specific situation depends on the licenses involved, how your product is distributed, and your jurisdiction. Consult qualified counsel for compliance decisions.
When the scan is complete, go to the Licenses tab to review findings. Use the filter box to narrow results (for example by package name, risk, or license).
If you see Manual Review packages, you can quickly focus them by filtering with risk:manual-review.
The Resolved by section shows which source determined each license (Syft, ClearlyDefined, ScanCode, etc.). You can use those source checkboxes to filter the Licenses table by provenance.
In the Licenses tab, OSSScan hides many build / CI tools by default to reduce noise. To include them in the Licenses table (and in what you're reviewing), enable the Show build / CI tools checkbox.
In the Licenses table, you can click the 🤖 (robot) action button to copy an AI Agent License Review Prompt for the selected component. Paste this prompt into your IDE's AI Coding Agent to instruct it to do a code-level review and analyze potential license risk in the context of how your project uses that dependency.
Sometimes you don't want one prompt — you want a queue. OSSScan is built to make it easy to hand the repetitive digging to AI, then keep the important part (judgment, policy, and sign-off) firmly human.
risk:manual-review.risk:copyleft (when present).--baseline flag.
--ack-license-ai-not-legal-advice alongside --bulk-license instead.Licenses/ folder containing:
ossscan.agent_job.json (machine-readable job manifest)AgentPrompt.md (deterministic starter prompt for agent runners)LicenseInstructions.md (how to process prompts and where to write results)Evaluations/ (recommended folder for agent-written outputs).json prompt file per visible package row (filenames are based on name@version)Licenses/ folder and delete or move aside
any request .json files you want to skip. The agent runner will only process the requests that remain.
result_output_pathOSSScan does not ship an AI model or store agent results. It generates consistent, evidence-first prompts (plus a tiny manifest) so external agent runners can do the heavy lifting and humans can make the final decisions.
Each bulk export writes an AgentPrompt.md entrypoint. The simplest way to run the batch is to tell your agent:
"Open AgentPrompt.md and follow it exactly."
Tip: OSSScan also shows quickstart steps in-app via Launch Agent → VS Code (GitHub Copilot)… or Launch Agent → Claude Desktop (Code/Local)….
AgentPrompt.md and tell Copilot Chat (Agent mode) to read it and follow it exactly./add-dir, then open AgentPrompt.md.AgentPrompt.md as the starter instruction. Run claude in your terminal and tell it to open AgentPrompt.md and follow it exactly.Tip: Save SBOM… also writes an HTML license report alongside the saved JSON file.
CVE scanning requires an SBOM to be in memory. This happens after you scan a folder, and it can also happen when you load a previously saved SBOM from file.
CVE scanning analyzes the current SBOM package inventory. This means build-time and CI tooling dependencies may also appear in the vulnerability results when they're present in the SBOM.
Grype uses a local vulnerability database to match SBOM packages to known CVEs. You can refresh it at any time using the Refresh DB action. OSSScan warns when the Grype database is older than a week and will require a refresh before running CVE scans.
Some findings may show a KEV flag, indicating the vulnerability is listed as known-exploited in the upstream data.
In the Vulnerabilities results table, click the 🤖 action button to copy an AI Agent Investigation Prompt for a specific CVE finding. Paste that prompt into your IDE's AI Coding Agent to evaluate the CVE in the context of your application's usage. This can greatly simplify and speed up investigation by focusing on practical reachability and evidence in your codebase.
If you have many findings, clicking 🤖 one row at a time is… character building. Bulk Investigate exports one JSON prompt per CVE finding so an agentic runner can process them in bulk.
severity:critical (or sev:critical).severity:critical,high to focus top priorities.CVE/ folder containing:
ossscan.agent_job.json (machine-readable job manifest)AgentPrompt.md (deterministic starter prompt for agent runners)CVEInstructions.md (how to process prompts and where to write results)Evaluations/ (recommended folder for agent-written outputs).json prompt file per finding (filenames are based on the CVE ID).json files you don't want investigated right now.
The agent runner will only process what remains.
Practical goal: let AI do the spelunking (searching, tracing imports, mapping dependency chains), then let humans review the evidence and choose the remediation path. In larger repos, this can shift work from time-consuming investigation to review/decision-making and can significantly reduce end-to-end turnaround.
After a CVE scan completes, use Export CVE Report to export an HTML report of the current vulnerability findings.
After an AI agent has processed a bulk export, use the Review tab to read each evaluation and record your team's final disposition.
Annotations are written as .annotation.json files alongside the agent's .result.json files inside the Evaluations/ folder.
These annotations are used in future delta scans to avoid re-investigating findings your team has already accepted.
CVE/ or Licenses/ subfolder (or select one of those directly)..result.json and .annotation.json files from the Evaluations/ subdirectory and displays them in tables..annotation.json file to disk.
Annotations are written directly into the Evaluations/ folder inside your export directory.
They do not modify the AI's .result.json file.
If you have a prior evaluations folder from an earlier scan, you can load it as a Baseline. OSSScan will check each current finding against the baseline and pre-fill the annotation form for items that already have an accepted annotation in the baseline. Items with a carried annotation show an ↵ Carried badge — click Edit to review and confirm.
Annotations carry over only for the same package version. If a package version has changed, no baseline annotation is carried.
Once evaluations are loaded, each section header shows an Export Annotated CVE Report… or Export Annotated License Report… button. This produces a standalone HTML report that combines the AI agent's evaluation with your team's annotations for each finding.
The annotated report is useful for sharing with stakeholders — it shows every finding, what the AI concluded, whether your team accepted it and why, and which items are still pending review. Findings the AI cleared (not exploitable / no concern) and findings the team has accepted both appear with their reasoning, giving the reader a complete picture.
The report includes a disclaimer that AI determinations are informational and that license classifications are not legal advice.
Setting a Re-review after date on an annotation marks it as expired after that date. Expired annotations show an Expired badge and are not carried over in delta scans, ensuring time-sensitive acceptances get re-examined on schedule.
If your project uses GitHub Dependabot, OSSScan can act as a companion to it. Dependabot watches continuously but is noisy — it keeps re-raising the same CVE alerts with no idea which ones you have already investigated. Update Dependabot (a button on the Review tab) pushes the conclusions from your evaluation back to GitHub: it dismisses the Dependabot alerts for the CVEs you cleared, each with a comment explaining why. Between OSSScan runs Dependabot keeps working, but the noise for findings you have already cleared is gone.
This is strictly one-way and touches only Dependabot alerts (the Security tab). It never changes your code,
your .github/dependabot.yml, or anything OSSScan hasn't evaluated.
You paste a GitHub token once per push. OSSScan never stores it — it is used for that single update and dropped when the dialog closes. Create a fine-grained personal access token scoped to just Dependabot alerts: Read and write on the repositories you choose, then revoke it when you are done. The dialog's How to enable link walks you through creating and revoking it step by step.
Run Update Dependabot as often as you like. It is authoritative for the alerts OSSScan has a verdict for:
clear a finding and its alert is dismissed; change your mind and mark it a concern and its alert is reopened on the next push.
Each alert is shown with its #number so multiple copies of one advisory are easy to tell apart.
Scope: Update Dependabot acts on the cleared findings matching your current Review filter/search. If a filter is active, the preview says how many cleared findings it is hiding — clear the filter to push everything you have cleared.
When copyleft-licensed packages are detected, OSSScan can scan your selected folder for import/reference hints to help you understand whether a dependency appears to be used directly.
Import/reference evidence is strongest when you scanned a local folder (not just loaded an SBOM), because the analysis can use the on-disk project files as context.
OSSScan can be driven from the command line so it can run in automation and be controlled by an agentic framework (for example: an IDE agent runner, Claude Code (the terminal CLI), or a custom internal workflow). This lets you kick off scans, produce outputs into a known folder, and then hand the repetitive investigation work to an agent — while keeping final review and policy decisions human.
The ideal end-state for many teams is an AI-native workflow where a project can be analyzed end-to-end and produce a clear, evidence-backed report of license and CVE risk for human review. In practice, getting there requires reliable package inventory, consistent context, and a repeatable way to route many individual investigations through an agent.
OSSScan is a bridge application that makes that practical today: it produces a normalized package inventory (SBOM + enrichments), summarizes findings in the UI, and can bulk-export structured investigation requests so an agentic workflow can process them at scale. The outcome is similar to an AI-native analysis pipeline — but with OSSScan providing the high-signal inputs and guardrails.
--headless): runs the job and exits automatically when complete.--ui): opens the UI, auto-runs the same job, and keeps the app open so a user can take over for manual investigations.In both modes, OSSScan does not show "pick a folder" dialogs — the scan directory and output folder come from CLI arguments. These modes also fail fast (with no dialogs) if the license is invalid/missing or if the Terms of Use have not been accepted on this machine.
Use --scan <dir> to scan a source directory, or --load-sbom <file> to skip scanning and load an existing SBOM file instead (SPDX JSON or CycloneDX JSON).
These two flags are mutually exclusive — specifying both is an error.
When using --load-sbom, Syft is not required or invoked; Grype is still required for CVE scanning.
See the CLI guide for exact flags and macOS launch commands.
OSSScan includes a built-in command generator so you don't have to remember flags or fight shell quoting. In the app menu, open Help → Create Command Line… to open the dialog (macOS menu bar, or the window menu on Windows).
--mode deep for best license coverage (matches what the UI's Deep scan produces).--ack-license-ai-not-legal-advice. If you manually type --bulk-license without that flag, the CLI fails instead of exporting.--cve-filter and --license-filter to reduce reports and bulk exports.--baseline / Delta Investigation)These rules apply whenever a baseline is used — the GUI's Delta Investigation mode for Bulk License Review / Bulk Investigate, or the CLI's --baseline <dir> flag alongside --bulk-cve or --bulk-license. OSSScan applies the following rules before writing any request files:
CVE findings:
carry_over: true, not expired).License findings:
Skipped items have their prior .result.json and .annotation.json copied into the new Evaluations/ folder so the export remains a complete record. Delta counts (new, re-assessed, screened) are logged to stdout and written into the ossscan.agent_job.json manifest.