Watch
€0
For one product or one public repository.
- CycloneDX and SPDX SBOMs on every push
- Daily rescans against OSV.dev, CISA KEV and EPSS
- A dated record of every scan and confirmation
- ENISA early-warning draft once you confirm
EU Cyber Resilience Act · GitHub App
Whenproof keeps a dated record of what you ship: an SBOM on every push, daily rescans against new advisories, and who confirmed what. If a dependency you shipped is exploited, you get the ENISA draft.
01 · The record
Under the Cyber Resilience Act, an actively exploited vulnerability has to be reported within 24 hours of becoming aware of it. The hard question afterwards is rarely “what is wrong”. It is “what did you ship, and when did you know?”
Whenproof answers it as you go. Every push and every daily rescan is stored with its date, the SBOM it produced and the advisories known at that moment. When someone confirms that a vulnerability is exploited, their name and the time are written down and never silently changed.
Documents and drafts are included. The record is the point.
scans, signals, exploitation, audit_log). Values in amber are placeholders, not sample data.02 · Every push
On every push to your default branch, Whenproof reads your lockfiles through GitHub's API, without cloning the repository, and writes a CycloneDX 1.6 and an SPDX 2.3 SBOM. Both are stored with the scan, so the SBOM for any past push is still there.
Reads package-lock.json, npm-shrinkwrap.json, Cargo.lock, poetry.lock and go.sum. The CLI also uses Syft when it is installed.
sbom.cdx.jsonCycloneDX 1.6 SBOMsbom.spdx.jsonSPDX 2.3 SBOMvulnerability-report.mdKnown vulnerabilities from OSV.devvulnerability-handling.mdPolicy draft, CRA Annex I Part IItechnical-documentation.mdSkeleton, CRA Annex VII{
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"serialNumber": "urn:uuid:urn:uuid:00000000-0000-4000-8000-000000000000",
"version": 1,
"metadata": { … },
"components": [
{
"type": "library",
"bom-ref": "pkg:npm/%40scope/util@1.2.3",
"name": "@scope/util",
"version": "1.2.3",
"purl": "pkg:npm/%40scope/util@1.2.3",
"properties": [
{
"name": "cra-kit:source",
"value": "package-lock.json"
}
]
},
{
"type": "library",
"bom-ref": "pkg:npm/lodash@4.17.20",
"name": "lodash",
"version": "4.17.20",
"purl": "pkg:npm/lodash@4.17.20",
"properties": [
{
"name": "cra-kit:source",
"value": "package-lock.json"
}
]
}, …
]
}
npm run scan -- test/fixtures/npm-app --offline on the sample project in the Whenproof repository. Excerpt: metadata folded, two of four components shown; the marked one is the package the check run below flags.03 · Every day
Each scan posts a check run on the commit: counts, the vulnerability table from OSV.dev, and expiring signed download links for the SBOMs and drafts. Stored SBOMs are rescanned every day, and each rescan is kept as its own dated entry, so the record shows what was known on which day. It never blocks a merge.
Whenproof neutral
1 known vulnerability in 4 components (1 new)
1 known vulnerability found (1 new since the last scan). Nothing is blocked; the findings are below.
| Components | Affected | Known vulnerabilities | New | Needs review |
|---|---|---|---|---|
| 4 | 1 | 1 | 1 | 0 |
Lockfiles scanned: package-lock.json
| File | Contents |
|---|---|
| sbom.cdx.json | SBOM, CycloneDX 1.6 |
| sbom.spdx.json | SBOM, SPDX 2.3 |
| vulnerability-report.md | Known vulnerabilities from OSV.dev |
| vulnerability-handling.md | Draft policy, CRA Annex I Part II |
| technical-documentation.md | Draft skeleton, CRA Annex VII |
Links are signed and expire; re-open the latest check run for fresh ones.
1 known vulnerability in 1 component of 4 scanned. Checked against OSV.dev by cra-kit on 2026-10-06 08:00 UTC.
| Components scanned | Affected | Known vulnerabilities | Exploitation signals |
|---|---|---|---|
| 4 | 1 | 1 | not checked |
Known is not exploited. CRA Article 14 reporting to ENISA applies to actively exploited vulnerabilities. Confirm exploitation before drafting an early warning.
| Severity | Component | Vulnerability | Fixed in | Lockfile |
|---|---|---|---|---|
| 7.2 High | lodash 4.17.20 | GHSA-35jh-r3h4-6jhm (CVE-2021-23337) Command Injection in lodash | 4.17.21 | package-lock.json |
04 · The free watch
The CRA's 24-hour reporting applies to actively exploited vulnerabilities, not to every advisory. When a dependency you shipped appears in CISA's KEV catalogue or crosses an EPSS score of 0.1, Whenproof flags it on a check run on the commit you shipped. Then it stops: a listing is a prompt, not a verdict.
If it's real, someone with write access confirms with a button on the check run (or the CLI). Whenproof records who and when, counts the deadlines from the moment you became aware, and writes the ENISA early-warning draft for you to complete and file. Nothing is submitted for you.
The watch is in the free plan. Email alerts are planned; today the flag arrives as a check run. What “actively exploited” means
## Deadlines
- Became aware at (UTC): {{awareAt}}
- Early warning due (24 h): {{earlyWarningDue}}
- Vulnerability notification due (72 h): {{notificationDue}}
## Product and vulnerability
- Manufacturer: {{manufacturer}}
- Product with digital elements: {{product}}
- Vulnerability: {{vulnId}} ({{aliases}})
- Affected component: `{{component}}`
- Fixed in: {{fixedIn}}
- Member States where the product is made available: {{memberStates}}
## Confirmation
- Exploitation confirmed by: {{confirmedBy}} at {{confirmedAt}} (via {{confirmedVia}})
{{…}} fields stay visible until a person fills them.05 · Access
Whenproof asks GitHub for the least it needs. SBOMs and drafts are stored by the app and reached through links that expire; nothing is committed to your code.
Not requested: contents: write, pull requests, issues, security events.
| Permission | Access | Why |
|---|---|---|
| Metadata | read | Required by GitHub for every app. |
| Contents | read | Read lockfiles through the trees and blobs API. |
| Checks | write | Post the result on your commit. |
Vulnerability data: OSV.dev. Exploitation prompts: CISA KEV and FIRST EPSS.
06 · Pricing
Planned prices, ex. VAT, in euros per product per month. Nothing is billed yet: these are the prices we plan to launch with. A product is what you sell; it can span several repositories.
€0
For one product or one public repository.
€19 per product / month
The evidence trail for every product you sell.
€49 per product / month
Everything in Track, plus the paperwork.
07 · Questions
Dates from the regulation and the Commission's and ENISA's pages. Not legal advice. Longer answers, with sources:
The Cyber Resilience Act, Regulation (EU) 2024/2847, entered into force on 10 December 2024. Since 11 September 2026, manufacturers must report actively exploited vulnerabilities and severe incidents in their products, including products already on the market (Article 14). From 11 December 2027 the rest applies: the essential requirements in Annex I (including an SBOM and vulnerability handling), technical documentation (Annex VII), conformity assessment and CE marking. The full timeline
The GitHub App isn't open for installs yet. What this page describes as working is built and tested; anything marked planned is not built yet. Leave your email and we'll write when you can install it.
What you place on the market: an app, a library, a device's firmware. It can live in one repository or several. Today Whenproof records per repository; grouping repositories into one product is planned, and pricing will follow the product, not the repository count.
No. It keeps records, produces SBOMs, tracks known vulnerabilities and drafts documents with the structure the CRA describes. You review, complete and sign off on them. Compliance depends on how your product is built, supported and documented, which a tool cannot decide for you.
No. Reports go through ENISA's Single Reporting Platform, live since 11 September 2026. According to ENISA's FAQ it has no API at launch, so filing is done by hand. Whenproof gives you the draft and the deadlines, counted from when you became aware.
No. Most known vulnerabilities in dependencies are not actively exploited, and only those trigger Article 14 reporting. KEV listings and high EPSS scores only prompt a person to look. A draft is written only after someone with write access confirms exploitation.
Not yet. Version 2.1.0 asks for SHA-512 component hashes, SPDX 3.0.1 or CycloneDX 1.6 or newer, and one SBOM per version. Whenproof writes CycloneDX 1.6 and SPDX 2.3 without hashes, per push rather than per release. Hashes and per-release SBOMs are planned. SBOM requirements
npm (package-lock.json, npm-shrinkwrap.json), Rust (Cargo.lock), Python with Poetry (poetry.lock) and Go (go.sum). pnpm, Yarn, uv and Maven/Gradle are planned; tell us yours when you sign up.
Free for one product or one public repository.