CRA readiness: product and component inventory, scored against the obligations that apply
5.8K
Compliance evidence and audit workflow platform. It tracks which products and components exist, how they relate, who owns them, whether they are in scope under each competing definition, and whether their evidence holds up.
Documentation: https://oscarvalenzuelab.github.io/CRAne · Apache-2.0
It answers the questions that are usually spread across several systems and several spreadsheets:
Obligations are plural: the CRA ships alongside FedRAMP and the NTIA minimum elements, each with its own checks, weights and reporting lens. Nothing imported is treated as a decision — everything lands as an observation, and approving it is a separate recorded act with an authority and a rationale.
You need Docker. Nothing else.
mkdir -p crane/data && cd crane
# The directory has to be writable by the container's user, so hand it your own uid.
docker run --rm -v "$PWD/data:/data" --user "$(id -u):$(id -g)" \
ovalenzuela/crane:latest init
# Eight invented products, chosen to show the situations this exists for.
docker run --rm -v "$PWD/data:/data" --user "$(id -u):$(id -g)" \
ovalenzuela/crane:latest demo
docker run --rm -p 127.0.0.1:8000:8000 -v "$PWD/data:/data" \
--user "$(id -u):$(id -g)" -e CRANE_ALLOW_UNAUTHENTICATED_BIND=1 \
ovalenzuela/crane:latest serve --host 0.0.0.0 --port 8000 --worker
Open http://127.0.0.1:8000.
The database is a single SQLite file at data/crane.db. Open it with any SQLite browser.
That is deliberate: nothing here is locked inside a format only this tool can read.
| Tag | Validator |
|---|---|
latest, X.Y.Z | none bundled |
ossbomer, X.Y.Z-ossbomer | ossbomer bundled |
Two variants, because the validator question has no single answer. SBOM conformance is
checked by a separate tool, and which one you need depends on which obligations you measure
against. The plain image runs everything except validations, which report the executable as
missing — recorded as a coverage gap rather than a compliance verdict, so nothing scores
as failing merely because a tool was never installed. The -ossbomer variant is the right
default if you are measuring against the CRA or NTIA profiles.
Both are linux/amd64 and linux/arm64. Pin a version for anything you depend on;
latest moves.
| Path | Mode | What goes there |
|---|---|---|
/data | read write | The SQLite database. The only thing that has to persist |
/exports | read write | Generated reports and evidence packages |
/runs | read write | Per-run working directories for executed tools |
/sources | read only | The documents and databases to import from |
Nothing is baked into the image except code. No database, no credentials, no data. It runs
as uid 10001, so mounted directories have to be writable by that uid — or pass
--user "$(id -u):$(id -g)" as above.
Inside a container the server has to bind 0.0.0.0 for a published port to reach it, so
it refuses to start that way unless you have made a decision:
CRANE_API_TOKEN — the real answer for anything reachable by anyone else.127.0.0.1 only and set CRANE_ALLOW_UNAUTHENTICATED_BIND=1.There is no TLS inside the container. Put a reverse proxy in front of it. Configure covers every variable.
No release is pushed with a fixable HIGH or CRITICAL vulnerability in it. The scan runs in the release workflow before the push, so a tag that exists is a tag that passed, and the gate ignores only findings with no fix available in any stable Debian suite.
Further than the gate requires: the perl interpreter is removed from the image entirely. Nothing here invoked it, and leaving it in meant carrying critical CVEs that Debian has no fix for in any stable suite. If a future base-image advisory does show up in the scan results with no upstream fix, that is what it is — unfixable, and named rather than hidden.
Security covers reporting a vulnerability, hardening a real deployment, and the design decisions that look like findings and are not.
The agent guide ships in the image, so an agent on a machine with no route to the documentation still has the rules, the exit codes and the working loop:
docker run --rm --entrypoint cat ovalenzuela/crane:latest /app/AGENTS.md
Content type
Image
Digest
sha256:a10bd387a…
Size
68.9 MB
Last updated
5 days ago
docker pull ovalenzuela/crane