Central place for the security state across the repositories we maintain — the
kairos-io organization plus external dependencies (mudler/*,
mauromorales/*). It aggregates open security PRs, image/binary CVEs,
source/dependency CVEs, and GitHub security alerts into a single dashboard, and
tells us what to focus on.
ksec is a Go CLI run on a schedule by GitHub Actions as a sequence of phases.
Each phase reads/writes committed JSON state under state/, so every run is
auditable in git history.
discover → build the tracked-repo list (kairos-io org + kairos-init deps + repos.yaml), dropping archived repos
collect → per repo: open security PRs, image CVEs (trivy), source CVEs (govulncheck), GitHub alerts, hadron component-manifest CVEs (OSV.dev + NVD)
correlate → dedupe findings + build the "waterfall" graph (one Go CVE → the set of affected repos)
triage → prioritize + write the "focus now" summary (self-hosted LocalAI via nib; deterministic fallback)
render → dashboard.md + dashboard.json (committed), site/index.html (GitHub Pages), tracking issue in kairos-io/kairos
This repository is read-only against every other repo: the only GitHub
write is upserting the single tracking issue in kairos-io/kairos. A
--dry-run flag turns every write into a printed plan.
Autonomous remediation (coordinated dependency bumps, PR creation, and reacting to review comments — including the "waterfall" case where one Go CVE needs bumps across many repos) is a planned follow-up (Plan 2) and is not part of this pipeline yet.
go build -o ksec ./cmd/ksec
ksec discover --state-dir state
ksec collect --state-dir state
ksec correlate --state-dir state
ksec triage --state-dir state
ksec render --state-dir state --dry-run # --dry-run prints intended writesEach phase consumes the previous phase's state file, so any phase can be re-run in isolation against committed state.
repos.yaml— hybrid repo overrides. Auto-discovery (thekairos-ioorg plus dependencies parsed fromkairos-init) is the base; this file adds external repos, excludes repos, and attaches per-repo metadata (artifacts to scan, branch, criticality).ai.yaml— LocalAI +nibhandles: which small model to run/preload, hownibpoints at the LocalAI endpoint, and the pinned tool versions. Overridable viaLOCALAI_URL,LOCALAI_MODEL,LOCALAI_VERSION,NIB_VERSION.hadron-components.yaml— mapskairos-io/hadron's published component manifest packages to how they're checked for CVEs (OSV.dev ecosystem/package, optional NVD CPE fallback). NVD lookups are optionally authenticated viaNVD_API_KEY(raises the rate limit from 5 to 50 requests/30s; unset works, just slower).
.github/workflows/security-dashboard.yaml runs the five phases on a schedule
(live by default; dry-run on workflow_dispatch input or fork PRs), starts
LocalAI as a runner service for triage, commits the updated state + dashboards
back to main, and publishes the HTML dashboard to GitHub Pages.