OpenCRA
CRA Article 14 reporting starts 11 September 2026. Know if you have a CISA KEV hit in one command.
OpenCRA is the open-source CLI and GitHub Action for Software Bills of Materials and actively-exploited vulnerability candidates.
A scanner hit is a candidate, never legal awareness. Article 14 clocks start only after a human assessment. OpenCRA does not file with ENISA, does not claim CE marking, and is not a notified body.
uvx opencra scan .
EU Cyber Resilience Act (CRA) Compliance in 60 Seconds
- Generate an SBOM — Syft inventories your directory or image (or pass an existing CycloneDX file).
- Map every PURL to OSV + CISA KEV — OpenCRA tells you which findings are on the Known Exploited Vulnerabilities catalog. Those are the ones that may start a 24-hour CRA clock after you become aware.
- Fail CI or export evidence — drop the Action into GitHub, or write CycloneDX / SPDX / a community PDF.
- uses: crwncode/opencra@v1
with:
fail-on-cve: true
Local scans are free. No account required. --sync-cloud is optional and only POSTs when you set both OPENCRA_API_URL and OPENCRA_API_KEY — there is no default commercial host.
Install
Syft is auto-installed to ~/.opencra/bin on first online directory scan, or brew install syft. CycloneDX JSON files do not need Syft.
# uv — no install
uvx opencra scan .
# pip / pipx
pipx install opencra
# or: pip install opencra
# Homebrew — Syft first, then the CLI
brew install syft pipx
pipx install opencra
opencra doctor
opencra kev refresh
opencra scan . --fail-on kev
GitHub Action
Published from this repo (crwncode/opencra@v1). Search OpenCRA on the GitHub Marketplace.
name: CRA
on: [push, pull_request]
jobs:
opencra:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: crwncode/opencra@v1
with:
fail-on-cve: true
| Input | Default | Meaning |
|---|---|---|
fail-on-cve |
false |
Fail the job on a CISA KEV hit |
fail-on |
kev |
none | kev | critical | high |
target |
. |
Directory, image, or CycloneDX JSON |
sync-cloud |
false |
POST to OPENCRA_API_URL when OPENCRA_API_KEY is set |
See packages/action/README.md for every input.
Why not just Syft or Grype?
| Tool | What it does |
|---|---|
| Syft | Generates an SBOM |
| Grype / osv-scanner | Finds known CVEs |
| OpenCRA | Tells you which findings are CISA KEV hits — the ones that may start a 24-hour CRA clock after you become aware |
CLI
# Syft is auto-installed to ~/.opencra/bin on first online directory scan, or:
brew install syft # macOS
# Linux: https://github.com/anchore/syft#installation
pipx install opencra
# or run without installing:
uvx opencra doctor
uvx opencra scan .
Quickstart
opencra doctor
opencra kev refresh
opencra scan . --fail-on kev
opencra scan . --format cyclonedx --output sbom.cdx.json
opencra scan . --export-pdf cra-report.pdf
opencra scan . --sync-cloud # optional ingest (needs OPENCRA_API_URL + OPENCRA_API_KEY)
opencra report --last
# Demo a KEV candidate (exit 1). Not legal awareness; do not auto-file.
opencra scan examples/sample-kev.cdx.json --fail-on kev
After a table scan:
[+] Scan complete: 0 critical vulnerabilities found.
--quiet and machine formats (json, cyclonedx, spdx) keep stdout clean. Full flag list: docs/cli.md.
Legal disclaimer
OpenCRA prepares evidence and highlights Known Exploited Vulnerabilities. It does not:
- start the Article 14 legal clock automatically
- file notifications on the ENISA Single Reporting Platform
- certify CRA compliance or CE marking
The 24-hour early warning and 72-hour notification run from awareness. The 14-day final report for actively exploited vulnerabilities runs from when a corrective measure is available, not from detection. Severe incidents have a one-month final report after the 72-hour notification.
Optional cloud ingest
--sync-cloud POSTs the normalized scan JSON to $OPENCRA_API_URL/v1/ingest when OPENCRA_API_KEY is also set. Neither variable has a default. A host-only value such as http://127.0.0.1:8000 still receives /v1/ingest appended. Without both, the local scan is unchanged.
To run the optional local API from this repo, see docs/saas.md.
License
Apache License 2.0. Copyright 2026 crwncode.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file opencra-0.1.6.tar.gz.
File metadata
- Download URL: opencra-0.1.6.tar.gz
- Upload date:
- Size: 9.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62fa961661892016b89dc36d7f944187f688bf8716cda383c219b3a3881c99bc
|
|
| MD5 |
53c4095bb2450d0ec7486366d1472497
|
|
| BLAKE2b-256 |
a7aa718d7eb7a6f1f9882091ee11ef233dc8355a3893ddda1228ea8a41a93cf7
|
Provenance
The following attestation bundles were made for opencra-0.1.6.tar.gz:
Publisher:
publish.yml on crwncode/opencra
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opencra-0.1.6.tar.gz -
Subject digest:
62fa961661892016b89dc36d7f944187f688bf8716cda383c219b3a3881c99bc - Sigstore transparency entry: 2768918031
- Sigstore integration time:
-
Permalink:
crwncode/opencra@4f817fd39597ddc72d3e2f64ee07c15a89db02d7 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/crwncode
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4f817fd39597ddc72d3e2f64ee07c15a89db02d7 -
Trigger Event:
release
-
Statement type:
File details
Details for the file opencra-0.1.6-py3-none-any.whl.
File metadata
- Download URL: opencra-0.1.6-py3-none-any.whl
- Upload date:
- Size: 7.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d95ac881d8da91229fd849c691bac562f2ab13b6b956c549c627bd9170eb2189
|
|
| MD5 |
2dc4ef188f4b8b9565a9717927318783
|
|
| BLAKE2b-256 |
1b86cd7ec0ec15fa2e0e8cc9315dd621c16890335dd616c049bfe48c9022270c
|
Provenance
The following attestation bundles were made for opencra-0.1.6-py3-none-any.whl:
Publisher:
publish.yml on crwncode/opencra
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opencra-0.1.6-py3-none-any.whl -
Subject digest:
d95ac881d8da91229fd849c691bac562f2ab13b6b956c549c627bd9170eb2189 - Sigstore transparency entry: 2768918100
- Sigstore integration time:
-
Permalink:
crwncode/opencra@4f817fd39597ddc72d3e2f64ee07c15a89db02d7 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/crwncode
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4f817fd39597ddc72d3e2f64ee07c15a89db02d7 -
Trigger Event:
release
-
Statement type: