The answer isn't wrong — it's that what we each mean by "external software" differs. It's hard to write Python without pulling in public libraries.
Those 9 pull in more libraries of their own. No one can track this list by hand.
It looks free because you don't pay for it, but what it really means is permission granted on condition. Break the condition and it becomes a copyright problem.
Complying with license terms isn't optional. Break them and it becomes unauthorized use — copyright infringement.
The problem is: if you don't know which library you use and at what version, you can't cross-check it at all.
This was a package received normally through an official distribution channel. Without a record of the version and provenance, you wouldn't even know you were running that version after the problem became public.
It records every component's name, version, license, and origin in a machine-readable format. It's not a document for people to read — it's a list a tool cross-checks automatically.
Name, version, license, and origin all go in a fixed format. There are two international standard formats: CycloneDX and SPDX.
The tool does the first two. A person does the third.
From source code, containers, firmware, a received SBOM, or an AI model, it produces an SBOM, an open source notice file, and security/license risk reports.
If it still won't open on Apple Silicon, run codesign --force --deep -s - /Applications/BomLens.app once more. Once it opens, the same web UI appears in the app's own window, not a browser.
To scan a different folder, close that window and run it again from the folder you want.
It's the file where your build tool declares which libraries the project uses. The scanner treats this file as its starting point, and the name differs by language — check where yours lives before you scan.
Today's example (Python) uses requirements.txt. If you use another language, find your row above.
The code hasn't changed at all. The scanner doesn't infer libraries by analyzing your code — it resolves dependencies starting from the manifest. Zero results doesn't mean safe. It means the scan never ran.
Check the run log for these two lines. They're logged at different points, under different conditions.
Checking just these four things heads off most zero-result false alarms.
The 39 components and 19 vulnerabilities you've seen on earlier slides are the result of scanning this exact code.
Result of a single scan
These three numbers alone tell you whether the scan actually worked.
Name, version, license, and origin all show on one row of the components screen. We'll come back to why the version matters shortly.
When you see an item like this in your own project, work it the same way — check the license, cross-check the version, record the conclusion.
CVSS, CVE, and fixed versions come from the ecosystem security databases Trivy cross-checks; EPSS is a live lookup against FIRST.org. On an air-gapped network only EPSS is skipped — everything else still shows.
These three can each be different. It's easy to check the code license and call it done.
| Layer | Case | Outcome |
|---|---|---|
| Code | The BusyBox GPL lawsuits (2009) | 14 companies sued, including Samsung and Best Buy; Westinghouse was ordered to pay over $100,000 in damages and stop distribution |
| Model | Getty Images v. Stability AI (2025) | The copyright claim against the model itself was dismissed, but a watermark left in outputs was found to infringe trademark |
| Training data | Bartz v. Anthropic (2025) | Training on pirated books came to light, leading to a $1.5 billion settlement — the largest copyright settlement on record |
Once it becomes litigation, this is the scale of damages you're looking at.
| Layer | Target | Finding |
|---|---|---|
| Code | github.com/MouseLand/cellpose | 113 components · 4 weak-copyleft |
| Model | huggingface.co/mouseland/cellpose-sam | BSD-3-Clause |
| Training data | cellpose.org/dataset | Out of the tool's reach |
The code and model are checked. But the training data is outside what the tool can reach — is it still safe to use as-is?
The model card alone can't tell you — someone has to go find the original page.
So the verdict is non-commercial, no-redistribution terms — something only a person reading the original text could have found, not the tool.
The non-commercial terms on cellpose.org we just found carry different weight depending on how you intend to use it.
When there's no basis to decide, the tool doesn't guess — it leaves the state as-is.
For anything the tool only flagged as "needs review," record the project owner's decision and the reasoning like this.
| Item | Disposition | Rationale | Date · Owner |
|---|---|---|---|
| Modelica | License confirmed | GitHub repository license detection confirmed BSD-3-Clause | 09-06 · J. Doe |
| Buildings | Needs review | No standard LICENSE file on GitHub — must check the repository docs directly | 09-06 · J. Doe |
| analysis_core.py | In-house code | Written internally, no external code referenced | 09-06 · J. Doe |
Keep it in the same folder as the SBOM output. Whoever inherits the project should be able to answer why it was handled that way.
There are two triggers for rescanning — something changed, or time has passed.
Run it once and stop, and all you have is a snapshot of that one moment. If the submitted list and what actually shipped diverge, the notice itself becomes wrong.
Whatever's left on the results screen doesn't resolve itself. Work through it in this order.
No complicated onboarding — just follow these steps.
SCA (Software Composition Analysis) is the automated discovery of open source components, licenses, and vulnerabilities. BomLens is one such tool.
That covers everything for today.
The tool only goes as far as finding what needs review — deciding whether something is safe to use still needs its own review.