Skip to main content

ign8cve-tracker

Self-hosted CVE tracker. Syncs the full NVD feed, discovers vulnerable software across your fleet via OpenVAS, OVAL scanning, and Red Hat Insights, raises a GitHub Issue for every new match, and ships a live status page.

pipx install "ign8cve-tracker[infra]"
ign8cve deploy   # provision Hetzner + deploy full stack

What it does

Component What it does
nvd-sync Full NVD sync on first run, incremental (lastModified) hourly after
inventory-sync Pulls host + software records from OpenVAS via python-gvm, upserts assets
oscap-sync Runs oscap oval eval on remote hosts over SSH, imports results
insights-sync Fetches CVE exposure lists from Red Hat Insights for enrolled RHEL systems
matcher Cross-joins assets × CVEs on CPE vendor+product, opens GitHub Issues for new matches
status-page aiohttp dashboard: CVE counts by severity, match list, 30-day sparklines
ign8cve CLI to provision/destroy the whole stack on Hetzner Cloud

Install

# just the daemons + status page
pip install ign8cve-tracker

# + deploy CLI (hcloud, paramiko, typer)
pip install "ign8cve-tracker[infra]"

Deploy

Requires Hetzner Cloud and (optionally) Cloudflare credentials as environment variables:

export HETZNER_TOKEN=...
export IGN8_CLOUDFLARE_TOKEN=...   # optional — for DNS
export IGN8_CLOUDFLARE_ZONE_ID=... # optional
export IGN8_DOMAIN=example.com     # optional

ign8cve deploy

Provisions a Hetzner cx23, installs Docker, uploads the stack, obtains a Let's Encrypt cert, and runs all services. DNS is configured in Cloudflare before TLS so certbot can complete the HTTP-01 challenge.

State is written to .ign8cve/state.json. SSH key at .ign8cve/keys/ign8cve.

ign8cve destroy   # tear down server + DNS

Run locally

cp .env.example .env   # fill in credentials

# individual daemons
nvd-sync
inventory-sync
matcher

# or all via Docker Compose
docker compose up

Database migrations:

alembic upgrade head

Configuration

All settings via environment variables (or .env). Key variables:

Variable Default Description
DATABASE_URL postgresql+asyncpg://ign8cve:ign8cve@localhost:5432/ign8cve PostgreSQL connection string
NVD_API_KEY — Raises NVD rate limit from 5 to 50 req/30 s
NVD_SYNC_INTERVAL 3600 Seconds between NVD syncs
OPENVAS_HOST localhost OpenVAS/GVM host
OPENVAS_PORT 9390 OpenVAS/GVM port
OPENVAS_USERNAME admin
OPENVAS_PASSWORD —
GITHUB_TOKEN — For opening Issues on new CVE matches
GITHUB_REPO — org/repo — e.g. acme/vulnerabilities
INSIGHTS_OFFLINE_TOKEN — Red Hat Insights offline token
INSIGHTS_SYSTEMS — JSON array: [{"id": "<uuid>", "display_name": "<host>"}]

Architecture

Three independent async daemons share a PostgreSQL database:

NVD API ──► nvd-sync ──► cves table
                                      ┐
OpenVAS/OVAL/Insights ──► inventory-sync / oscap-sync / insights-sync
                       ──► assets table ──► matcher ──► matches table ──► GitHub Issues

CPE matching is intentionally loose: vendor + product must match, version is ignored. This catches CVEs whose CPE wildcards the version. Precise version-range matching (versionStartIncluding / versionEndExcluding) is the main area for future improvement.

Metadata

Release files for ign8cve-tracker 0.1.0

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

Source distribution (sdist)

Source distribution for ign8cve-tracker 0.1.0
File Size Uploaded Provenance Actions
ign8cve_tracker-0.1.0.tar.gz 34.2 kB Without provenance Details for ign8cve_tracker-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for ign8cve-tracker 0.1.0
File Interpreter ABI Platform Actions
ign8cve_tracker-0.1.0-py3-none-any.whl Python 3 none any Details for ign8cve_tracker-0.1.0-py3-none-any.whl

Total release size: 75.2 kB

Release files / ign8cve_tracker-0.1.0.tar.gz

Download URL ign8cve_tracker-0.1.0.tar.gz
Size 34.2 kB
Tags Source
SHA-256 checksum
How to use checksums
06cb26c3fc4302975dffe0d758b4fa6b206a56812e0ee0e00f697a90881e8435
BLAKE2b-256 checksum
How to use checksums
3e24a9871acb829ffc65ca05638e2a423fd4bb60bab55eb0681b02743c302003
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.3.4 CPython/3.14.4 Darwin/25.4.0

Release files / ign8cve_tracker-0.1.0-py3-none-any.whl

Download URL ign8cve_tracker-0.1.0-py3-none-any.whl
Size 41.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a411ee07fa5ff7c3d16268f97862748f899ac3f4f62483655490036bf7758936
BLAKE2b-256 checksum
How to use checksums
9f36bfe3488566e770ea9b59a23854c86dfdfe59c6c7c978506d51b65e672994
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.3.4 CPython/3.14.4 Darwin/25.4.0

Security for ign8cve-tracker 0.1.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

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