Skip to main content

Vexcalibur

Vexcalibur wordmark and sword logo

CI CodeQL OpenSSF Scorecard Dependency Review

Vexcalibur turns software bills of materials and vulnerability findings into VEX documents, for the security and release engineers who publish VEX statements alongside an SBOM. It reads CycloneDX SBOMs, SPDX 3 SBOMs, or a GitHub Dependency Graph SBOM. Findings come from an OSV-compatible service or a local file.

Current releases write CycloneDX 1.6, OpenVEX 0.2.0, CSAF 2.0, and SPDX 3.0.1 JSON. CSAF output uses the csaf_vex profile, and SPDX 3 output goes through the security profile's VEX relationships. SPDX 3 output arrived in v0.7.0. This branch also reads local SPDX 3.0.1 JSON-LD SBOMs; no release through v0.7.2 includes that input.

The project is usable, but still pre-1.0. Pin an exact release because command flags, Python APIs, and detailed output may change.

What works today

Area Support
SBOM input CycloneDX JSON and XML 1.4–1.6; SPDX 3.0.1 JSON-LD; GitHub Dependency Graph SPDX 2.3 JSON
Finding sources Public OSV with explicit consent; private OSV-compatible endpoints; local findings files
VEX output CycloneDX 1.6 JSON; OpenVEX 0.2.0 JSON; CSAF 2.0 JSON with the csaf_vex profile; SPDX 3.0.1 JSON-LD with the security profile
Automation A companion GitHub Action
Migration A narrow vexy command-line compatibility layer
Python 3.10–3.14

Install a release

Vexcalibur needs Python 3.10 through 3.14.

python3 -m venv .venv
source .venv/bin/activate
pip install vexcalibur
vexcalibur --help

In PowerShell, the virtual environment puts its commands under Scripts:

py -m venv .venv
.venv\Scripts\Activate.ps1
pip install vexcalibur
vexcalibur --help

With uv, one command handles the environment and there's nothing to activate:

uv tool install vexcalibur

That gives you the latest release, which is what you want to try it out. Vexcalibur is pre-1.0, so pin an exact version in anything you automate. The install guide covers pinning, PATH setup, and how to check which formats your release supports.

Once it's installed, generate your first document against your own SBOM.

Try local generation from a checkout

Use this path to work on Vexcalibur itself, or to run unreleased output formats. Clone the repository, then install its locked dependencies:

uv sync --frozen

Installing the dependencies may reach the configured package index. The generate command below uses only local inputs, so it never reaches a vulnerability service.

Generate a VEX document from the committed example files:

uv run --frozen vexcalibur generate \
  tests/fixtures/sbom/cyclonedx-json-simple.json \
  --offline \
  --findings-file tests/fixtures/findings/all-analysis-states.json \
  --timestamp 2026-06-23T00:00:00Z \
  --output /tmp/vexcalibur-vex.json

Check the result:

uv run --frozen python - <<'PY'
import json
from pathlib import Path

vex = json.loads(Path("/tmp/vexcalibur-vex.json").read_text())
assert vex["bomFormat"] == "CycloneDX"
assert vex["specVersion"] == "1.6"
assert len(vex["vulnerabilities"]) == 5
print("generated CycloneDX VEX")
PY

See the quickstart for the guided version of this example.

CycloneDX is the default. To write OpenVEX, add --format openvex and name the document author. To write CSAF 2.0, add --format csaf and the document and publisher metadata it needs. The OpenVEX guide and CSAF guide each carry a runnable example and the evidence rules for that format.

Choose a finding source

Vexcalibur needs exactly one finding source per run.

Inventory and trust boundary Use
Findings already exist locally Use --findings-file findings.json. Add --offline for a local SBOM.
Inventory may go to an internal service --osv-url https://osv.internal.example
Inventory is approved for public OSV --allow-public-osv

Warning: --allow-public-osv sends package URLs and versions to https://api.osv.dev. Do not use it with a private SBOM or sensitive package inventory unless that disclosure is approved.

Without that flag, the public endpoint fails closed. Fetching an SBOM from GitHub crosses a separate network boundary; it doesn't give Vexcalibur permission to send the resulting inventory to public OSV.

Documentation

The complete manual is at vexcalibur-dev.github.io/vexcalibur.

Getting started

Work through the quickstart, then follow the CycloneDX, OpenVEX, CSAF, or SPDX 3 generation guide. Check project status for current limits.

Running it

The CLI reference covers flags and failure behavior. Read the CycloneDX, OpenVEX, CSAF, or SPDX 3 output contract before consuming generated files.

Embedding it

The Python API guide and API reference cover the supported facade. Read the provider contract and renderer contract before adding an integration, and the architecture before adding a source or output format.

Execution reports

The execution report reference covers the machine-readable generation metadata, and the Python report guide covers the cross-platform API. Both describe the default branch, so verify that your release lists --execution-report in vexcalibur generate --help first. The CLI report transaction supports Linux and macOS; Windows embeddings build and validate the same report through the Python facade.

Contributing

The complete local gate runs on Linux and needs the host tools listed in Reproduce important gates. That guide includes exact portable commands for macOS and Windows. Required pull-request CI runs the Linux-only checks.

On Linux, refresh the base branch and run the quality and coverage gates from the repository root:

git fetch origin main
make check
make coverage COVERAGE_COMPARE_REF=origin/main

Documentation changes must also build without warnings:

uv sync --frozen --extra docs
make docs

Parser, source-client, package-URL, and terminal-safety changes must also run the deterministic fuzz smoke profile:

make fuzz-smoke

See the contribution guide and the security policy before opening a pull request. The contributor documentation collects the style policy, fuzzing guide, CI layout, and governance checks.

Use the issue forms for questions, bugs, and feature requests. The organization support policy explains which public route to use, and the code of conduct applies to project spaces.

Vexcalibur is licensed under the Apache License 2.0.

Release files for vexcalibur 0.8.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vexcalibur 0.8.1
File Size Uploaded
vexcalibur-0.8.1.tar.gz 1.2 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for vexcalibur 0.8.1
File Interpreter ABI Platform
vexcalibur-0.8.1-py3-none-any.whl Python 3 none any Details

Total release size: 1.3 MB

Release files / vexcalibur-0.8.1.tar.gz

Download URL vexcalibur-0.8.1.tar.gz
Size 1.2 MB
Tags Source
SHA-256 checksum
How to use checksums
2ed20c938e4ac12c30f090d8b685fa4b2fbad91c0449fec1ff28433ab9070f3b
BLAKE2b-256 checksum
How to use checksums
8c1e022a27112edc48174b3b18ed9d06d14c4d1af830683ec627d71ef15d2516
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.

Transparency log

Release files / vexcalibur-0.8.1-py3-none-any.whl

Download URL vexcalibur-0.8.1-py3-none-any.whl
Size 126.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d1491d18ddb73a59febecbe4cabfde089c2e1fab23999af5485d1b9d937cec6d
BLAKE2b-256 checksum
How to use checksums
8c678ce6a8055fc3089376e3bd3d0241f3e9ea454cc816b9ff72e96def4e4f69
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.

Transparency log

Release history Release notifications | RSS feed

0.8.2

2 release files

This release

0.8.1 This release

2 release files

0.8.0

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page