DevInt operator documentation
DevInt gives you a live, queryable, standardized inventory of everything installed and trusted across your fleet of Linux and Kubernetes nodes — OS packages, language dependencies, binaries, certificates, kernel and runtime configuration — enriched with vulnerability data and read-only security findings, all in one console.
How it fits together
A tiny read-only agent on each node collects a full bill-of-materials and pushes it over mutual TLS to the control plane, which normalizes, deduplicates, enriches with CVE data, and answers fleet-wide questions through the console you are reading the docs for.
┌──────────────┐ mTLS push ┌───────────────┐ ┌──────────────────────────┐
│ Edge agents │ ────────────► │ Ingest / │──►│ Query / Intelligence │
│ (Linux/K8s) │ BOM deltas │ normalize+CVE │ │ (graph + search + store) │
└──────────────┘ └───────────────┘ └───────────┬──────────────┘
The Console (this UI) ◄─┘
Onboarding a node
Connecting a node takes three steps. The whole exchange is automatic after you paste one command.
1 · Mint an enrollment token
In the console, open Onboarding (under Platform). Fill in a label, choose the agent privilege mode, optionally a cluster tag, a time-to-live (default 1 hour), and how many nodes the token may enroll (max uses — set 0 for unlimited-until-expiry to bulk-enroll a fleet). Click Mint token and copy the value — it is shown once.

2 · Run the install command on the node
The console shows the exact command with your token substituted in.
# Linux host curl -sSL https://<your-instance>/install | sh -s -- --token=<TOKEN> # Kubernetes (in-cluster agent) helm install devint oci://<your-instance>/chart --set token=<TOKEN>
The agent generates its own keypair, sends a certificate signing request plus the token, and receives an mTLS client certificate whose identity carries its assigned node_id and your org_id.
3 · Watch it appear
Within seconds the node shows up under Devices and begins streaming its full CycloneDX inventory. A re-enrolled node is reconciled by its stable machine-id, so re-installs never create duplicates.
Every screen, explained
Each console screen below: what you see, the possible values, and how to read them.
Dashboard
The at-a-glance posture of your whole fleet: node count and coverage, the CVE severity rollup, open security findings, and recent activity.

| Tile | Values | How to interpret |
|---|---|---|
| Fleet total / stale | counts | Stale = not seen in 15 min. A rising stale count means agents stopped reporting — check connectivity before trusting the rest. |
| Coverage | full / partial | Partial means a collector ran degraded (e.g. missing capability). Findings are still honest but incomplete for that node. |
| CVE rollup | critical / high / medium / low | Distinct CVEs affecting the org, counted once. Critical is your triage queue; click through to Vulnerabilities. |
Devices
The fleet inventory — every node, host or container. This is the entry point to per-node detail.

| Column | Values | How to interpret |
|---|---|---|
| Type | ▢ host / ⬡ container | A host is a bare OS; a container is a pod that inventories its own image and the cluster it watches. Containers link to the host they run on (a container-escape foothold). |
| Cluster | link / — | The cluster this node serves. Click it to see cluster-wide findings. |
| Mode | root / least_priv | The agent's privilege. least_priv nodes report partial coverage for collectors that need root. |
| Critical / Exp. certs | counts | Open critical CVEs and expired certificates on that node — the two fastest signals of risk. |
Device detail
Click any device to open it. The left panel is the node's general information; the tabs on the right hold its components, certificates, and vulnerabilities.

General information (left)
Node ID and machine-id, type, OS family and kernel, agent mode, coverage, the cluster it serves, the host it runs on, and enrolled / last-seen timestamps. This is the node's identity and provenance at a glance.
Tabs (right)
- components — every package and dependency with its ecosystem and CVE count. Sorted worst-first.
- certs — certificates found on the node; an expiry in the past is shown in critical red.
- vulns — CVEs affecting this node, with severity, CVSS, and the offending component. Only exploitable (VEX-affected) CVEs appear.
The CycloneDX ↓ button exports the node's full bill-of-materials verbatim.
Clusters
Kubernetes clusters as first-class assets. A container node that watches a cluster serves it; the cluster owns the cluster-scoped findings (RBAC, privileged pods, NetworkPolicy) rather than hanging them off the sensor pod.

| Column / field | Values | How to interpret |
|---|---|---|
| Distribution / Version | k3s, gke, eks… / server version | Detected from the cluster's API. Helps you match findings to a known baseline. |
| Nodes | count | How many agents observe this cluster. More sensors = more corroboration. |
| Critical / High | counts | Cluster-scoped findings by severity: a cluster-admin ServiceAccount, a wildcard ClusterRole, a namespace with no NetworkPolicy. |
Open a cluster for its identity (kube-system UID), the nodes serving it, and the full findings list.
Vulnerabilities
The fleet-wide CVE view. Each row is a distinct CVE with its severity, CVSS, whether it is a known-exploited vulnerability, and how many nodes it affects.

| Field | Values | How to interpret |
|---|---|---|
| Severity | critical / high / medium / low | From CVSS. Combine with KEV and affected-node count to prioritize. |
| KEV | flag | On CISA's Known-Exploited-Vulnerabilities list — actively exploited in the wild. Treat as top priority regardless of CVSS. |
| VEX state | affected / not affected / fixed | DevInt separates present from exploitable: a scary upstream version may already carry a backported distro fix. Only affected rows are real exposure. |
xz 5.2.5-1ubuntu may already be patched. DevInt orders versions and checks fixed-ness separately, so it suppresses false positives instead of alarming on the raw version string.Certificates
Every certificate DevInt found across the fleet — TLS, CA, self-signed — with expiry, key strength, and signature algorithm. Only fingerprints and metadata are stored; never private key material.

| Field | Values | How to interpret |
|---|---|---|
| Expires | date | Past dates are shown critical — an expired cert in production is an outage waiting to happen. |
| Bits | 2048, 4096… | Under 2048 is weak. RSA-1024 and DSA should be rotated. |
| Self-signed | yes / no | Self-signed on a public surface is a trust risk; on internal mTLS it may be expected. |
Security
The read-only security findings the agents report: privilege-escalation surface, SSH hygiene, exposed ports, host posture, supply-chain tampering, and more. Each finding links to a runbook in Knowledge.

Finding categories map to collectors — see The agent & collectors for exactly what each one inspects. Severity is critical → info; findings are pruned automatically when the underlying issue is resolved on the next scan.
Drift
What changed since the last scan. DevInt content-addresses each bill-of-materials and diffs it against the prior state: components and findings that appeared, disappeared, changed, or were tampered.

| Field | Values | How to interpret |
|---|---|---|
| Kind | appeared / disappeared / changed / tampered | Tampered (an integrity mismatch) is always critical and suspicious. |
| Attribution | manual_change / automated_deployment / suspicious / resolved | Fleet-relative: a change unique to one node reads as manual/out-of-band; one spread across the fleet reads as a rollout. |
| Confidence | 0–1 | How sure the attribution is. Low confidence warrants a look. |
The first scan of a node establishes an immutable baseline silently. You can acknowledge a drift event to hand it off with a note.
Fleet
Group nodes, pick a golden node, capture a desired-state baseline, and validate convergence — which nodes match the baseline and which have drifted.

| Field | Values | How to interpret |
|---|---|---|
| Convergence % | 0–100 | How closely a node matches the group baseline. 100 = compliant. |
| Missing / Extra | counts | Components the baseline has that the node lacks (missing) or that the node has beyond it (extra). |
Geography
Where your fleet lives. Nodes roll up into a region → country → city → datacenter tree; drill down on a tactical map (self-hosted, no external tiles) to see posture aggregated per location.

Posture (CVEs, findings) aggregates up the tree, so a region tile reflects everything beneath it.
Alerts
Grouped, deduplicated alert instances with a full lifecycle. New high/critical findings and CVEs fire alerts routed by your rules to email and webhooks.

| State | Meaning |
|---|---|
| firing | Active and unhandled. |
| acknowledged | Someone owns it. |
| snoozed | Silenced temporarily. |
| resolved | Underlying condition cleared. |
Related events are grouped by fingerprint, so 12 CVEs from one rollout become one alert, not twelve pages.
Integrations
Third-party tool findings, normalized alongside DevInt's own. Connect an EDR/scanner (e.g. via signed webhook); DevInt unifies health, findings, and coverage — and shows where a tool should be reporting but isn't.

A coverage gap (a node an EDR doesn't cover) is itself a finding — blind spots are risk.
Insights
Suspicious-pattern detection and the attack-surface graph. Fleet-relative anomalies (a binary on only one node in a cluster) and combination queries (a node with both a privilege-escalation finding and an exposed port) surface here.

Query
The visual query builder. Ask any question of the fleet — components, certificates, CVEs, findings — and turn the answer into a saved view, an alert, or an exported inventory.

Knowledge
The runbook library. Every finding type has an entry: what it is, why it matters, and how to fix it, with reference links. Findings in the console link straight to their runbook.

Settings
Collection schedules per device class. Each group of collectors (core, runtime, compliance, k8s) has its own cadence, pushed to the agent so it self-paces — you tune how often each layer is re-scanned.

Onboarding & tokens
Covered in full under Onboarding a node. This screen mints reusable enrollment tokens, lists all tokens with their validity and use counts, and lets you revoke any of them. Token management requires the admin role.
The agent & its collectors
The agent is a tiny read-only Rust binary. It runs a set of collectors, each reporting its coverage honestly as full, partial, or skipped. Collectors are organized into groups that can be scheduled independently (see Settings).
Core group — the inventory
| Collector | What it monitors |
|---|---|
pkg.dpkg | OS packages from the distro package database (Debian/Ubuntu dpkg): name, version, source. |
lang.deps | Language dependencies (e.g. Cargo and other ecosystems) with their resolved versions. |
certs | X.509 certificates on disk: subject, issuer, expiry, key bits, self-signed — fingerprints only, never keys. |
Runtime group — live privilege surface
| Collector | What it monitors |
|---|---|
sec.suid | SUID/SGID binaries, classified GTFOBins-exploitable vs expected-distro. |
sec.ssh | SSH key hygiene: weak keys (DSA, RSA<2048), world-readable authorized_keys, host keys — fingerprints only. |
sec.ports | Listening sockets parsed from /proc/net: wildcard binds, sensitive-port exposure. |
sec.sudoers | sudoers policy: risky NOPASSWD / wildcard rules. |
sec.caps | Linux file capabilities (security.capability xattr) that grant elevated power without SUID. |
Compliance group — host posture & integrity
| Collector | What it monitors |
|---|---|
sec.integrity | Supply-chain tamper: out-of-band installs and dpkg md5 mismatches (a modified system binary). |
sec.users | Accounts DB: UID-0 duplicates and empty-password accounts. |
sec.mac | Mandatory-access-control status: SELinux / AppArmor present and enforcing. |
sec.writable | World-writable cron and systemd paths (a persistence / PATH-hijack vector). |
sec.audit | auditd presence — is the host even recording security events. |
sec.weakperm | Weak permissions on sensitive files. |
Kubernetes group — cluster attack surface
| Collector | What it monitors |
|---|---|
sec.k8s | Runs only in-cluster (ServiceAccount token present). Read-only queries of the K8s API for: over-broad ClusterRoles (wildcard verbs+resources), ServiceAccounts bound to cluster-admin, privileged/root pods, and namespaces without a NetworkPolicy. Also reports the cluster's identity (kube-system UID + version) so it becomes a first-class Cluster asset. Findings here belong to the cluster, not the pod. |
Data lifecycle & vulnerability detection
What happens to the data
- Emit. The agent assembles a CycloneDX 1.6 BOM (components + certs + findings as spec-compliant properties, no schema fork) and content-addresses it — so ingest volume scales with your change rate, not fleet size.
- Push. It sends the BOM (or just the delta) to the ingest gateway over mutual TLS. The client certificate carries the node and org identity, so a node can never write into another tenant.
- Normalize & store. The control plane deduplicates and writes the relational source of truth (PostgreSQL), the raw BOM (object store), a search index (OpenSearch), and enqueues graph projection.
- Project. An async worker builds the Apache AGE graph: nodes, components, certificates, findings, and the relationships between them —
HAS_COMPONENT,RUNS_ON(container→host),SERVES(node→cluster),AFFECTED_BY. - Query. The console routes each question to the cheapest store — a point lookup, an aggregation, or a graph traversal.
How posture aggregates
Counts roll up along the structures you browse: a cluster aggregates the findings of the nodes that serve it; a location aggregates everything in its subtree; a group aggregates convergence against its baseline. Every count is a live query, so drilling from a tile to the underlying set never goes stale.
How vulnerabilities are detected
- Match. Each component (by package URL) is matched against live CVE feeds — OSV.dev plus distro data — to find candidate CVEs.
- Suppress false positives. DevInt separates version ordering from CVE fixed-ness. A distro backport (
-1ubuntu) can fix a CVE without bumping the upstream version — those are marked not affected via VEX, so you don't chase ghosts. - Prioritize. Confirmed affected CVEs carry CVSS severity, and any on CISA's Known-Exploited-Vulnerabilities catalog are flagged KEV — actively exploited, triage first.
- Alert on deltas. Newly-appearing critical/high CVEs and findings feed the alerting pipeline, grouped and routed by your rules.
DevInt operator documentation. The console is built on the same design system you see here. Questions a screen doesn't answer? Almost everything pivots — any entity opens to detail, any count opens to its filtered set.