User Guide

<!-- Copyright (c) 2026 Pierre Gronau, ndaal in Cologne -->

# User Guide

## Accessing the Web UI

Open your browser and navigate to:

```text
https://localhost:8080/
```

On first visit you will see a self-signed
certificate warning. Click **Advanced** then
**Proceed to localhost** to continue.

### Which port?

nvulnlookup serves the web UI and the API on
**8080** (TLS 1.3 over TCP, HTTP/1.1 +
HTTP/2). Port **8081** is the QUIC / HTTP/3
listener for the same content.

Those two numbers belong to nvulnlookup only.
On a host that also runs other ndaal
services, `8180` / `8181` is csaf-crud and
`8680` / `8681` is sbom-auditor — so
`https://localhost:8180/` is a different
application, not this one.

## Dashboards dropdown — fluid responsive layout (v0.1.45)

The Dashboards navbar menu adapts its column
count to the viewport width. No setting — open
the dropdown and the browser picks how many
columns to use based on the available space:

| Viewport (typical device) | Columns |
| --- | :---: |
| 360 px (phone portrait) | 1 |
| 768 px (tablet) | 3 |
| 1024 px (laptop) | 5 |
| 1366 px (laptop+) | 8 |
| 1600 px (display) | 9 |
| 1920 px (desktop) | 11 |
| ≥ 3840 px (4K) | 12 (capped) |

If an item you expect to see (e.g. a vendor
dashboard like Cisco, Microsoft, IBM, Red Hat,
or an OSV ecosystem like Rust, Python, Go,
npm) appears below the visible area:

1. The full list is **always present** in the
   HTML — verify with
   `curl -sk https://localhost:8080/ \
   | grep -F '/dashboards/<slug>'`.
2. Maximise the browser window, or zoom out
   (Ctrl/Cmd + minus) one notch.
3. As a UX safety belt, scroll the page — the
   dropdown extends past the viewport rather
   than being clipped (deliberate: clipping
   was the pre-v0.1.43 bug that hid the OSV +
   VulnerabilityFeed categories).

Pre-v0.1.45 the dropdown used fixed
breakpoints (1 col / 2 cols / 9 cols at
576 px and 992 px) which produced a
single-column tall list on 1366 px laptops
and an off-viewport overflow on smaller
screens. See `CHANGELOG.md` v0.1.45 entry
for the CSS rewrite details.

## Visual Tour — every page in the v0.1.42 navbar

This section walks every page reachable from the
top navigation bar and explains:

- **Navigation** — the click path from the home
  page to that screen.
- **Why this page exists** — the operator
  problem it solves and the data source(s)
  driving it.
- **The screenshot** — captured at 1920 × 1080
  in light theme against a freshly seeded
  `vl-web` instance. All images live under
  `documentation/graphics/light/`; a parallel
  dark-theme set lives under
  `documentation/graphics/dark/`. Filenames
  carry no timestamp by design — Markdown links
  point to stable names so a refresh updates
  the image in place.

Re-capture the entire set against your own
deployment with:

```bash
bash scripts/create_screenshots_from_local_running_app.sh
```

### Top-level navigation

#### Home

**Navigation:** Click the **Vulnerability-Lookup**
brand on the top-left of every page (or visit
`/` directly).

**Why this page exists:** the canonical landing
page. Surfaces the three numbers an operator
checks first — total indexed vulnerabilities,
total Critical-severity rows, and active data
sources — plus a search bar pre-tuned for CVE
ID / keyword / Log4Shell / buffer-overflow
queries, plus the most-recent 25
vulnerabilities so a fresh visitor can see
that the indexer is alive.

![Home page](graphics/light/home.png)

#### Statistics

**Navigation:** top navbar → **Statistics**
(or `/stats`).

**Why this page exists:** raw aggregate
numbers — total CVE rows, breakdowns per
severity bucket and per source. Use this when
"how big is the index right now?" is the
question; the [Dashboard](#dashboard) renders
the same data as charts.

![Statistics](graphics/light/statistics.png)

#### Dashboard

**Navigation:** top navbar → **Dashboards** →
**Overview** (or `/dashboard`).

**Why this page exists:** charts, not numbers —
CVE publishing rate over time, CVSS severity
distribution (3.1 / 4.0 toggle), top CNAs,
feeder activity summary. This is the page
that goes on a dashboard wall during a
SOC handover.

![Dashboard overview](graphics/light/dashboard.png)

#### Recent

**Navigation:** top navbar → **Recent**
(or `/recent`).

**Why this page exists:** paginated list of
the most-recently-modified vulnerabilities
across every source. Filterable by source
(comma-separated) and by an `?days=N`
look-back window. This is the page on which
a vulnerability analyst starts every shift.

![Recent vulnerabilities](graphics/light/recent.png)

#### KEV

**Navigation:** top navbar → **KEV**
(or `/kev`).

**Why this page exists:** lists every entry
on the CISA Known Exploited Vulnerabilities
catalog — the gold-standard "patch this NOW"
feed. Each row links to the full advisory
plus our annotation hub for sightings and
operator notes.

![KEV catalog](graphics/light/kev.png)

**Other catalogs:** the page has one tab per catalog — CISA KEV, CIRCL KEV, EUVD
KEV, VulnCheck KEV and ndaal KEV. The VulnCheck catalog needs an API token that
an administrator stores on the server. While it has no entries, its tab says why
instead of leaving the table blank: for example that no token is stored, that
VulnCheck refused it, or that the feeder has not finished its first run yet
(it starts 35 minutes after the server). That message is meant for your
administrator; there is nothing to fix on your side.

### Specialised dashboards

These dashboards have custom URL shapes or
data models that don't fit the generic
`VENDOR_SPECS` template. Each one solves a
specific operator question.

#### CAPEC enrichments

**Navigation:** top navbar → **Dashboards** →
**CAPEC Enrichments** (or
`/dashboards/capec-enrichment`).

**Why this dashboard exists:** MITRE CAPEC
(Common Attack Pattern Enumeration and
Classification) maps each CWE to the
adversary techniques used to exploit it.
This dashboard joins our CWE enrichment with
the CAPEC dictionary so a defender can answer
"what attack pattern do I look for in WAF /
EDR logs given the CWE family of this CVE?"

![CAPEC enrichments dashboard](graphics/light/dashboard_capec_enrichment.png)

#### GCVE enrichments

**Navigation:** top navbar → **Dashboards** →
**GCVE Enrichments** (or
`/dashboards/gcve-enrichment`).

**Why this dashboard exists:** GCVE
(Global CVE allocation) is CIRCL's GNA-aware
ID schema — a stable cross-CNA identifier
that survives MITRE re-issues and CNA
mergers. This dashboard tracks how many of
our CVEs already have a GCVE counterpart and
highlights the gaps.

![GCVE enrichments dashboard](graphics/light/dashboard_gcve_enrichment.png)

#### EPSS — Exploit Prediction Scoring (since v0.1.41)

**Navigation:** top navbar → **Dashboards** →
**EPSS** (or `/dashboards/epss`).

**Why this dashboard exists:** EPSS (FIRST.org
Exploit Prediction Scoring System) gives each
CVE a 0.0–1.0 probability that it will be
exploited within 30 days. This dashboard
cross-tabs EPSS by year and by CVSS-bucket so
an operator can answer "of all the CVEs we're
NOT already patching, which carry the highest
exploitation odds?" The 10-bucket histogram
of raw EPSS probability shows where the
ecosystem's risk mass actually sits.

![EPSS dashboard](graphics/light/dashboard_epss.png)

#### Nuclei templates (since v0.1.41)

**Navigation:** top navbar → **Dashboards** →
**Nuclei Templates** (or
`/dashboards/nuclei_templates`).

**Why this dashboard exists:** ProjectDiscovery's
[nuclei-templates](https://github.com/projectdiscovery/nuclei-templates)
repo carries thousands of fingerprintable
checks — CVE PoCs, default-credential probes,
exposure detectors. This dashboard shows
which of OUR indexed CVEs already have a
Nuclei template (so the analyst can
re-validate the finding offline) and lets the
operator download the raw YAML body in a
single JSON envelope.

The page-source rendering safety of this
dashboard is pinned by an integration test
(`crates/vl-web/tests/test_inline_script_escape.rs`):
nuclei templates frequently embed
`</script>` strings as XSS-detector
matchers, and unescaped emission of the JSON
into an inline `<script>` block would break
the browser's HTML parser.

![Nuclei templates dashboard](graphics/light/dashboard_nuclei_templates.png)

#### KEV Ransomware (since v0.1.42)

**Navigation:** top navbar → **Dashboards** →
**KEV Ransomware** (or
`/dashboards/kev-ransomware`).

**Why this dashboard exists:** CISA periodically
flips a CVE's `knownRansomwareCampaignUse`
flag in the KEV catalog from `Unknown` to
`Known` — without a public announcement.
This silent update tells defenders the CVE is
now actively exploited by ransomware crews,
but only operators who diff the KEV daily
catch it.

[Greynoise's blog post](https://www.greynoise.io/blog/unmasking-cisas-hidden-kev-ransomware-updates)
documents how they monitor the daily diff.
Their feed plus a historical CSV bootstrap
drive this dashboard.

Sources:
[`kev-ransom-feed.rss`](https://kev.labs.greynoise.io/kev-ransom-feed.rss)
·
[`ransomware-status-changes-2025.csv`](https://info.greynoise.io/hubfs/artifacts/ransomware-status-changes-2025.csv)

![KEV Ransomware dashboard](graphics/light/dashboard_kev_ransomware.png)

#### CVE vs GitHub (since v0.1.42)

**Navigation:** top navbar → **Dashboards** →
**CVE vs GitHub** (or
`/dashboards/cve-vs-github`).

**Why this dashboard exists:** the GitHub
Advisory Database (OSV-shaped) and the
canonical CVE source (NVD / cvelistv5 /
fkie_nvd) frequently disagree on CVSS v3 base
scores. When the disagreement crosses 0.1,
this dashboard surfaces the deviation —
total count, per-severity bucket, per year.
Useful for triage when the two scoring
authorities disagree on whether something is
"High" or "Critical".

![CVE vs GitHub dashboard](graphics/light/dashboard_cve_vs_github.png)

### Vendor / ecosystem dashboards

The 20 dashboards below all use the same
generic `vendor_dashboard` Askama template,
driven by a single `VENDOR_SPECS` table —
adding a new row registers a new dashboard
without touching the template. Each shows
the **last 25 entries** for its source with
HTMX "Load next 25" pagination and a
per-advisory drill-down at
`/dashboards/<slug>/<advisory_id>`.

Operator pattern: when a customer asks
"what's the latest from $VENDOR?", the answer
is one click in this dropdown.

#### CERT-Bund

**Navigation:** Dashboards → **CERT-Bund** (or
`/dashboards/cert-bund`).

CSAF advisories from the German national CERT
(`csaf_certbund`).

![CERT-Bund dashboard](graphics/light/dashboard_cert_bund.png)

#### Cisco

**Navigation:** Dashboards → **Cisco** (or
`/dashboards/cisco`).

CSAF advisories from
`csaf_cisco` — Cisco Systems product PSIRT.

![Cisco dashboard](graphics/light/dashboard_cisco.png)

#### CVE List v5

**Navigation:** Dashboards → **CVE List v5**
(or `/dashboards/cvelistv5`).

The official MITRE CVE 5.0 record store —
the canonical record format for every CVE.

![CVE List v5 dashboard](graphics/light/dashboard_cvelistv5.png)

#### FKIE-NVD

**Navigation:** Dashboards → **FKIE NVD**
(or `/dashboards/fkie-nvd`).

Fraunhofer FKIE's CVE re-issue feed — useful
when NVD itself is down or behind on
ingestion.

![FKIE-NVD dashboard](graphics/light/dashboard_fkie_nvd.png)

#### GCVE

**Navigation:** Dashboards → **GCVE**
(or `/dashboards/gcve`).

CIRCL's Global CVE feed (the IDs themselves,
not the enrichment dashboard above which
joins them with our CVE corpus).

![GCVE dashboard](graphics/light/dashboard_gcve.png)

#### GitHub

**Navigation:** Dashboards → **GitHub**
(or `/dashboards/github`).

The GitHub Advisory Database (OSV-shaped) —
covers package-ecosystem advisories that
often arrive BEFORE NVD assigns a CVE.

![GitHub dashboard](graphics/light/dashboard_github.png)

#### GSD (since v0.1.44)

**Navigation:** Dashboards → **GSD**
(or `/dashboards/gsd`).

`gsd` — the Cloud Security Alliance's
Global Security Database, a community-
curated CVE-adjacent advisory feed. Sits
alphabetically between **GitHub** and
**Go** in the "Vulnerability feed"
category of the dropdown.

**Maintenance banner.** This is the first
dashboard to render a yellow Bootstrap
"alert alert-warning" block above the
stats strip:

> *Data source no longer maintained. This
> data source is no longer maintained —
> the upstream
> `cloudsecurityalliance/gsd-database`
> repository was last updated 2024-04-29.
> Do not expect further updates;
> displayed entries are a historical
> snapshot.*

The banner is driven by the new
`VendorSpec.maintenance_note` field; any
future abandoned source can opt in to the
same banner by setting that field on its
`VENDOR_SPECS` row.

![GSD dashboard](graphics/light/dashboard_gsd.png)

#### Go (OSV)

**Navigation:** Dashboards → **Go**
(or `/dashboards/go`).

`osv_golang` — the Go vulnerability database
(`vuln.go.dev`). Curated by the Go security
team for module-level advisories.

![Go dashboard](graphics/light/dashboard_go.png)

#### JVN

**Navigation:** Dashboards → **JVN**
(or `/dashboards/jvn`).

Japan Vulnerability Notes — the Japanese
JPCERT/CC + IPA joint advisory database.
Useful for catching CVEs in Japanese-vendor
products that NVD covers slowly.

![JVN dashboard](graphics/light/dashboard_jvn.png)

#### Microsoft

**Navigation:** Dashboards → **Microsoft**
(or `/dashboards/microsoft`).

`csaf_microsoft` — the Microsoft Security
Response Center (MSRC) CSAF feed. Patch
Tuesday lives here.

![Microsoft dashboard](graphics/light/dashboard_microsoft.png)

#### ndaal

**Navigation:** Dashboards → **ndaal**
(or `/dashboards/ndaal`).

ndaal's own published CSAF advisories
(`ndaal-sa-YYYY-NNN`). Used to broadcast
findings from this codebase's release
pipeline AND advisories about consultancy
findings.

![ndaal dashboard](graphics/light/dashboard_ndaal.png)

#### openSUSE

**Navigation:** Dashboards → **openSUSE**
(or `/dashboards/opensuse`).

`csaf_opensuse` — the openSUSE security feed
(SUSE-SU-YYYY-NNNN advisories).

![openSUSE dashboard](graphics/light/dashboard_opensuse.png)

#### Oracle

**Navigation:** Dashboards → **Oracle**
(or `/dashboards/oracle`).

`csaf_oracle` — Oracle's quarterly
Critical Patch Update CSAF feed. Database,
WebLogic, Java, the lot.

![Oracle dashboard](graphics/light/dashboard_oracle.png)

#### Pentagrid

**Navigation:** Dashboards → **Pentagrid**
(or `/dashboards/pentagrid`).

`csaf_pentagrid` — pentest findings published
by the Swiss firm Pentagrid AG. Mostly
hardware / IoT defects.

![Pentagrid dashboard](graphics/light/dashboard_pentagrid.png)

#### Python (PySec)

**Navigation:** Dashboards → **Python**
(or `/dashboards/python`).

`pysec` — the OSV-shaped Python advisory
database, covering PyPI packages.

![Python dashboard](graphics/light/dashboard_python.png)

#### Red Hat

**Navigation:** Dashboards → **Red Hat**
(or `/dashboards/redhat`).

`csaf_redhat` — Red Hat's Errata + Bugzilla-
backed CSAF advisories. Your RHSA / RHBA /
RHEA stream.

![Red Hat dashboard](graphics/light/dashboard_redhat.png)

#### Rust (RustSec)

**Navigation:** Dashboards → **Rust**
(or `/dashboards/rust`).

`osv_rustsec` — the RustSec advisory
database, covering crates.io packages. A
must-watch when shipping a `Cargo.lock` to
production.

![Rust dashboard](graphics/light/dashboard_rust.png)

#### SUSE

**Navigation:** Dashboards → **SUSE**
(or `/dashboards/suse`).

`csaf_suse` — SUSE's enterprise security feed
(SUSE-SU-YYYY-NNNN advisories — same shape
as openSUSE but supported product matrix).

![SUSE dashboard](graphics/light/dashboard_suse.png)

#### Ubuntu

**Navigation:** Dashboards → **Ubuntu**
(or `/dashboards/ubuntu`).

`osv_ubuntu` — Canonical's Ubuntu Security
Notices (USNs).

![Ubuntu dashboard](graphics/light/dashboard_ubuntu.png)

#### VMware

**Navigation:** Dashboards → **VMware**
(or `/dashboards/vmware`).

`csaf_vmware` — VMware's VMSA security
advisory feed. Includes vCenter, ESXi,
NSX, Workstation.

![VMware dashboard](graphics/light/dashboard_vmware.png)

#### Vulnrichment (since v0.1.36)

**Navigation:** Dashboards → **Vulnrichment**
(or `/dashboards/vulnrichment`).

CISA's Vulnrichment program — adds CVSS,
CWE, KEV-status, and remediation hints to
CVEs that are otherwise sparsely populated.

![Vulnrichment dashboard](graphics/light/dashboard_vulnrichment.png)

### CNA Scorecard

**Navigation:** top navbar → **CNA Scorecard**
(or `/cna-scorecard`).

**Why this page exists:** scores every CVE
Numbering Authority on disclosure cadence,
CWE coverage, CVSS completeness, and KEV-flag
adoption. Refreshed hourly. When a vendor
asks "how good is my CNA hygiene?", this is
the answer.

![CNA Scorecard](graphics/light/cna_scorecard.png)

### Info dropdown

The right-corner **Info** dropdown
(`partials/nav_right.html`) gathers six
pages that don't fit anywhere else. Every
page in the dropdown is reachable from
every other page in the app — by design,
since they're typically operator-only-once
visits.

#### About

**Navigation:** top-right **Info** → **About**
(or `/about`).

The marketing landing page — what
nvulnlookup is, what it covers, the live
[rust-doctor](https://crates.io/crates/rust-doctor)
score, the licence headline. The first stop
for anyone evaluating the project.

![About page](graphics/light/info_about.png)

#### System info

**Navigation:** top-right **Info** →
**System info** (or `/system-info`).

Live deployment introspection: version,
uptime, total indexed vulnerabilities,
memory + disk usage of redb / SQLite, list of
configured feeders. The page operators
screenshot when filing a bug.

![System info](graphics/light/info_system_info.png)

#### Privacy

**Navigation:** top-right **Info** →
**Privacy** (or `/privacy`).

GDPR-aware privacy policy: this self-hosted
deployment processes only the public CVE
corpus and the operator's own annotation
metadata — no third-party analytics, no
tracking pixels, no telemetry.

![Privacy page](graphics/light/info_privacy.png)

#### Security

**Navigation:** top-right **Info** →
**Security** (or `/security`).

Hardening posture: TLS 1.3-only listeners,
the
[`security.txt`](https://www.rfc-editor.org/rfc/rfc9116)
contact, our PGP key, our CSAF disclosure
shape, our cargo-vet posture.

![Security page](graphics/light/info_security.png)

#### Licence

**Navigation:** top-right **Info** →
**License** (or `/license`).

Apache-2.0 plus a per-dependency licence
table with copies of every upstream LICENSE
file embedded in the binary. Run-once
compliance check.

![License page](graphics/light/info_license.png)

#### Imprint (since v0.1.42)

**Navigation:** top-right **Info** →
**Imprint** (or `/imprint`).

German legal-notice landing page (§ 5 TMG /
§ 10 MStV) for the EU-hosted reference
deployment. 14 alias redirects (`/impressum`,
`/datenschutz`, `/sicherheit`, `/lizenz`, …)
land here too.

![Imprint page](graphics/light/info_imprint.png)

### Annotations dropdown

#### Notifications

**Navigation:** top navbar → **Annotations** →
**Notifications** tab (or
`/annotations?tab=notifications`).

**Why this page exists:** in-app alerts that
fire when a sighting / KEV flag flip / new
advisory matches an operator-defined
pattern. The hub for "let me know when X
happens" workflows that don't rise to the
level of a full ticket.

![Notifications](graphics/light/annotations_tab_notifications.png)

### Per-CVE detail — Log4Shell reference

**Navigation:** any link to a CVE — e.g. from
`/recent`, `/sightings`, or a dashboard's
recent table. Direct URL:
`/vulnerability/CVE-2021-44228`.

**Why this page exists:** the canonical
"everything we know about this CVE" landing
page. Captured here on
[CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228)
(Log4Shell) because it lights up every
enrichment surface the v0.1.42 release
introduced — CAPEC, CISA-KEV, EPSS, Nuclei,
GitHub Advisory, OSV: Maven, plus the
aggregated bundle (one JSON with every
available source, downloadable via the
`/api/v1/vulnerability/{id}/enrichment`
endpoint).

When `/sightings` lists a CVE that hasn't
landed in the canonical vulnerabilities
table yet, this page renders a 200
placeholder showing whatever enrichment
cards are available — the bug-fix in
v0.1.42 that replaced the previous 404.

![Log4Shell detail](graphics/light/vulnerability_log4shell.png)

## End of visual tour

## Home Page

The home page shows aggregate statistics and
recent vulnerabilities.

![Home Page](graphics/light/home.png)

- **Total Vulnerabilities** count
- **Critical Severity** count
- **Data Sources** count
- **Recent vulnerabilities** table with ID,
  title, severity badge, CVSS score, source,
  and last-modified date

### Dark Mode

Toggle the theme using the moon/sun icon in
the navigation bar.

![Home Page (Dark)](graphics/dark/home.png)

## Searching

Use the search bar in the navigation or the
large search input on the home page.

- Search by **CVE ID**: `CVE-2021-44228`
- Search by **keyword**: `log4j`, `buffer
  overflow`, `remote code execution`
- Search by **advisory ID**: `GHSA-*`,
  `RUSTSEC-*`, `GO-*`

Results update live as you type (HTMX).

### Partial words (since v1.2.66)

A query now matches a **prefix** of an
indexed word, so you no longer have to type a
whole term to get a hit. An exact match still
outranks a prefix match, so searching `log4j`
keeps the `log4j` entries at the top.

Before v1.2.66 a partial word returned nothing
at all. Measured on the reference corpus of
384,585 CVE records and 432 ndaal advisories:

| Query | Before v1.2.66 | v1.2.66 |
| --- | ---: | ---: |
| `log4` | 0 | 50 |
| `log4she` | 0 | 6 |
| `heartble` | 0 | 1 |

### "Search unavailable" (since v1.2.66)

If a search runs past its time budget, the
page now says so: the server answers HTTP
**503 Service Unavailable** with a
`retry-after: 30` header. Wait half a minute
and try the query again.

Before v1.2.66 that same timeout rendered as
an empty result list, which was
indistinguishable from "nothing matched" — an
outage was reported as a legitimate answer. An
empty result page now means one thing only: no
record matched your query.

## Dashboard

The dashboard at `/dashboard` provides visual
analytics across all vulnerability data.

![Dashboard](graphics/light/dashboard.png)

### CVE Publishing Statistics

- **Total CVEs**: aggregate count
- **Daily Rate**: average CVEs per day
- **Mean Gap**: average time between publications
- **Batch Rate**: percentage published within
  60 seconds of another
- **Hourly Distribution** (UTC): bar chart
- **Top 10 CNAs**: pie chart
- **Monthly Trend**: line chart

### CVSS Severity Distribution

- Toggle between **CVSS 3.1** and **CVSS 4.0**
- Select timeframe: 1, 2, 3, 4, 5, or 6 months
- Pie chart + bar chart showing CRITICAL / HIGH
  / MEDIUM / LOW / NONE

### Vendor / Ecosystem Charts

- Source tabs: NVD, Rust, OSV, PySec, JVN,
  VARIoT, GitHub, GSD, US KEV
- Top N selector (1, 5, 10, 25, 50)
- Chart type: Pie, Bar, or Line

![Dashboard (Dark)](graphics/dark/dashboard.png)

## Vulnerability Detail

![Vulnerability Detail](graphics/light/vulnerability_log4shell.png)

Click any vulnerability ID to see:

- **Header**: ID, severity badge, CVSS score
- **Description**: Full advisory text
- **Timeline**: Published and modified dates
- **CVSS Details**: Attack vector, complexity
- **Affected Products**: If available
- **References**: Clickable external links
- **Linked Vulnerabilities**: Related entries
- **Raw JSON**: Collapsible accordion

## Recent Page

![Recent Vulnerabilities](graphics/light/recent.png)

Browse the full list of recent vulnerabilities
at `/recent`. Features:

- **Timeframe picker**: 24h, 7 days, 30 days,
  90 days, or all time
- **Source filter**: Click source badges to
  filter by specific feeds
- **Pagination**: "Load more" button for
  infinite scroll

## Debian Security Tracker (since v0.1.31)

Navigate to `/dashboards/debian` for a live
view of the Debian Security Tracker:

- **Stats card**: total packages, CVEs, open /
  fixed counts, urgency breakdown
- **Top packages by open CVEs**
- **Per-release breakdown**
  (oldstable / stable / testing / unstable /
  experimental)
- **Urgency histogram**
- **Last 25 recent entries** with an in-page
  **"Load next 25"** button: each click fetches
  the next page via HTMX and appends rows to
  the same table, up to 500 entries total —
  no full navigation.
- Every CVE cell is a link to
  `/dashboards/debian/cve/{id}`, which shows
  the standard merged-view detail page PLUS a
  **"Debian Security Note (raw)"** accordion
  card with the upstream tracker payload for
  that CVE. When the CVE is tracked by Debian
  but not yet in any upstream feed, the page
  still renders (with a minimal header and the
  raw Debian blob) instead of 404'ing.
- When upstream ships an empty `description`
  for a CVE, the dashboard synthesizes one
  from the `releases` sub-object
  (e.g. `"Open in sid; Fixed in bookworm
  (1.2.3-4)"`).

## Vendor Dashboards (since v0.1.34)

Fifteen additional dashboards sit next to the
Debian one under the **Dashboards** dropdown
(alphabetised after "Overview"):

- `/dashboards/cert-bund` — BSI CERT-Bund WID
  CSAF advisories
- `/dashboards/cisco` — Cisco PSIRT
- `/dashboards/github` — GitHub Advisory DB
  (OSV)
- `/dashboards/go` — Go Vulnerability DB (OSV)
- `/dashboards/microsoft` — Microsoft MSRC
- `/dashboards/ndaal` — ndaal-published CSAF
  advisories
- `/dashboards/opensuse` — openSUSE Project
- `/dashboards/oracle` — Oracle CPU
- `/dashboards/pentagrid` — Pentagrid
- `/dashboards/python` — PyPI / PySec
- `/dashboards/redhat` — Red Hat Product
  Security
- `/dashboards/rust` — RustSec Advisory DB
  (OSV)
- `/dashboards/suse` — SUSE Linux Enterprise
- `/dashboards/ubuntu` — Ubuntu Security
  Notices
- `/dashboards/vmware` — VMware / Broadcom

Each page shows the **Last 25 recent entries**
for its source, HTMX "Load next 25" pagination,
and a per-advisory drill-down at
`/dashboards/<slug>/<advisory_id>`. The recent
table lists **Advisory · Severity · CVSS ·
Published · Title** — the **CVSS** column shows
the numeric base score (e.g. `9.8`) extracted
from the advisory's CVSS metrics, and is blank
when the source carries no score. The same
content is also reachable at
`/vulnerability/<vendor>/<advisory_id>` for
operators who prefer a vendor-qualified URL.

Unlike the Debian dashboard, these do not
pre-aggregate upstream JSON — they query the
shared vulnerability store by source
(`get_last(source = Some(…))`) and rely on the
generic `/vulnerability/{id}` merged view for
the drill-down. When a feeder has not yet
populated data for a source, the dashboard
renders cleanly with "no advisories yet".

## CNA Scorecard

Navigate to `/cna-scorecard` for quality scores
of CVE Numbering Authorities (sourced from
[RogoLabs/CNAScoreCard](https://github.com/RogoLabs/CNAScoreCard)).
**Refreshed every hour** (since v0.1.31;
previously every 12 hours).

## KEV Catalogs

![KEV Catalogs](graphics/light/kev.png)

Navigate to `/kev` for Known Exploited
Vulnerabilities catalogs:

- **CISA KEV**: US Cybersecurity and
  Infrastructure Security Agency
- **CIRCL KEV**: CIRCL Luxembourg
- **EUVD KEV**: EU Vulnerability Database

## Theme

Click the moon/sun icon in the top-right
navbar to toggle between **light** (default)
and **dark** themes. Your preference is
saved automatically.

## About Page

![About Page](graphics/light/info_about.png)

The about page at `/about` shows:

- Version and rust-doctor quality scores
- Security features (TLS, fuzzing, auditing)
- Comparison table: CIRCL vs ndaal
- Architecture overview

## License

![License](graphics/light/info_license.png)

Apache License, Version 2.0. See `/license`.

## System Information

![System Information](graphics/light/info_system_info.png)

The system info page at `/system-info` shows:

- OS, kernel, hostname
- CPU, memory, swap, disk usage
- Uptime

## RSS and Atom Feeds

Subscribe to vulnerability updates:

- RSS: `https://localhost:8080/feed/rss`
- Atom: `https://localhost:8080/feed/atom`

## Severity Badges

| Badge | CVSS Range | Color |
| --- | --- | --- |
| CRITICAL | 9.0 - 10.0 | Red |
| HIGH | 7.0 - 8.9 | Orange |
| MEDIUM | 4.0 - 6.9 | Yellow |
| LOW | 0.1 - 3.9 | Green |