Sector // Overview

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.

Dead-simple onboardingAdding a node is one copy-paste command. The agent provisions its own identity, proves it once over DevInt's own certificate authority, and streams its first inventory automatically.
One standard formatEvery node emits CycloneDX 1.6 + VEX. Everything downstream — storage, graph, UI export — speaks that one format, so nothing is locked in.
Intelligence, not just an SBOMBeyond "what is installed", DevInt detects suspicious patterns: fleet-relative anomalies, supply-chain tampering, certificate hygiene, and cluster attack surface.

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) ◄─┘
Observer-only. Agents read and report; they never change your systems. DevInt feeds and validates your own tooling (Ansible/Terraform/GitOps) — it never drives it.

Sector // Onboard

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.

Onboarding screen with token minting
Onboarding → mint an enrollment token, then the ready-to-paste install command.

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.

Tokens are manageable. Every token you mint is listed with its use count and a valid / revoked status. Revoke one instantly to stop further enrollments; existing nodes keep their own certificates and are unaffected.

Sector // Reference

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.

Dashboard
Fleet summary, CVE severity rollup, and finding counts.
TileValuesHow to interpret
Fleet total / stalecountsStale = not seen in 15 min. A rising stale count means agents stopped reporting — check connectivity before trusting the rest.
Coveragefull / partialPartial means a collector ran degraded (e.g. missing capability). Findings are still honest but incomplete for that node.
CVE rollupcritical / high / medium / lowDistinct 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.

Devices list
All nodes with type, cluster, OS/kernel, mode, coverage, and open criticals.
ColumnValuesHow to interpret
Type▢ host / ⬡ containerA 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).
Clusterlink / —The cluster this node serves. Click it to see cluster-wide findings.
Moderoot / least_privThe agent's privilege. least_priv nodes report partial coverage for collectors that need root.
Critical / Exp. certscountsOpen 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.

Device detail
General-information panel (left) beside the components / certs / vulnerabilities tabs (right).

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.

Clusters list
Clusters with distribution, version, node count, and finding severity rollup.
Column / fieldValuesHow to interpret
Distribution / Versionk3s, gke, eks… / server versionDetected from the cluster's API. Helps you match findings to a known baseline.
NodescountHow many agents observe this cluster. More sensors = more corroboration.
Critical / HighcountsCluster-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.

Vulnerabilities
Fleet CVEs with severity, KEV flag, and affected-node counts.
FieldValuesHow to interpret
Severitycritical / high / medium / lowFrom CVSS. Combine with KEV and affected-node count to prioritize.
KEVflagOn CISA's Known-Exploited-Vulnerabilities list — actively exploited in the wild. Treat as top priority regardless of CVSS.
VEX stateaffected / not affected / fixedDevInt separates present from exploitable: a scary upstream version may already carry a backported distro fix. Only affected rows are real exposure.
Distro-fixed correctness. 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.

Certificates
Fleet certificate inventory with expiry and hygiene signals.
FieldValuesHow to interpret
ExpiresdatePast dates are shown critical — an expired cert in production is an outage waiting to happen.
Bits2048, 4096…Under 2048 is weak. RSA-1024 and DSA should be rotated.
Self-signedyes / noSelf-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.

Security findings
Findings grouped by category and severity, each actionable.

Finding categories map to collectors — see The agent & collectors for exactly what each one inspects. Severity is criticalinfo; 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.

Drift
Per-node and fleet drift events with attribution and confidence.
FieldValuesHow to interpret
Kindappeared / disappeared / changed / tamperedTampered (an integrity mismatch) is always critical and suspicious.
Attributionmanual_change / automated_deployment / suspicious / resolvedFleet-relative: a change unique to one node reads as manual/out-of-band; one spread across the fleet reads as a rollout.
Confidence0–1How 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.

Fleet groups
Groups with golden node, baseline, and per-node convergence.
FieldValuesHow to interpret
Convergence %0–100How closely a node matches the group baseline. 100 = compliant.
Missing / ExtracountsComponents 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.

Geography map
Geographic drill-down with subtree posture aggregation.

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.

Alerts
Alert instances through firing → acknowledged → snoozed → resolved.
StateMeaning
firingActive and unhandled.
acknowledgedSomeone owns it.
snoozedSilenced temporarily.
resolvedUnderlying 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.

Integrations
Unified tool findings and coverage gaps.

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.

Insights
Attack-surface combinations from the privilege graph.

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.

Query builder
Build a query; export it as Ansible/Terraform 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.

Knowledge base
Runbooks: what / why / how-to-fix per finding type.

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.

Settings
Per-device-class collection cadences.

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.


Sector // Deep dive

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

CollectorWhat it monitors
pkg.dpkgOS packages from the distro package database (Debian/Ubuntu dpkg): name, version, source.
lang.depsLanguage dependencies (e.g. Cargo and other ecosystems) with their resolved versions.
certsX.509 certificates on disk: subject, issuer, expiry, key bits, self-signed — fingerprints only, never keys.

Runtime group — live privilege surface

CollectorWhat it monitors
sec.suidSUID/SGID binaries, classified GTFOBins-exploitable vs expected-distro.
sec.sshSSH key hygiene: weak keys (DSA, RSA<2048), world-readable authorized_keys, host keys — fingerprints only.
sec.portsListening sockets parsed from /proc/net: wildcard binds, sensitive-port exposure.
sec.sudoerssudoers policy: risky NOPASSWD / wildcard rules.
sec.capsLinux file capabilities (security.capability xattr) that grant elevated power without SUID.

Compliance group — host posture & integrity

CollectorWhat it monitors
sec.integritySupply-chain tamper: out-of-band installs and dpkg md5 mismatches (a modified system binary).
sec.usersAccounts DB: UID-0 duplicates and empty-password accounts.
sec.macMandatory-access-control status: SELinux / AppArmor present and enforcing.
sec.writableWorld-writable cron and systemd paths (a persistence / PATH-hijack vector).
sec.auditauditd presence — is the host even recording security events.
sec.weakpermWeak permissions on sensitive files.

Kubernetes group — cluster attack surface

CollectorWhat it monitors
sec.k8sRuns 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.
Secrets discipline. The agent reports fingerprints and metadata for keys and certificates, the names and locations of Kubernetes secrets — never their values. API keys are hashed; mTLS is used everywhere.

Sector // Deep dive

Data lifecycle & vulnerability detection

What happens to the data

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Query. The console routes each question to the cheapest store — a point lookup, an aggregation, or a graph traversal.
Rebuildability. Only PostgreSQL and the object store are authoritative. The graph, the search index, and the CVE joins are derived projections that can be rebuilt from scratch — the strongest possible disaster-recovery and consistency story.

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

  1. Match. Each component (by package URL) is matched against live CVE feeds — OSV.dev plus distro data — to find candidate CVEs.
  2. 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.
  3. Prioritize. Confirmed affected CVEs carry CVSS severity, and any on CISA's Known-Exploited-Vulnerabilities catalog are flagged KEV — actively exploited, triage first.
  4. 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.