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.

Component detail (drill-down)

Click any component to open it fleet-wide: its ecosystem and versions, the CVEs affecting it, and every node that carries it — so "which machines have this package" is one click, not a query.

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.

Cluster detail (drill-down)

Open a cluster for its identity (kube-system UID), distribution and version, the nodes serving it, the full cluster-scoped findings list, and its live workload inventory — namespaces, pods, and the images running in them. From here the Topology graph draws the whole cluster.

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.

CVE detail (drill-down)

Open a CVE for its description, CVSS vector, KEV status, the affected component(s), and every node it touches — the pivot from "a CVE exists" to "here is exactly where, and whether it is exploitable."

CVE detail
One CVE: description, severity, affected component, and every node it reaches.

Images

Container images running across your clusters, scanned as first-class assets. Every distinct image observed in a cluster is pulled apart into its own package inventory (via Trivy) and matched against the same CVE pipeline as hosts — so a vulnerable base image is visible fleet-wide, not hidden inside a pod.

Images
Scanned images with package count and a critical/high CVE rollup.
FieldValuesHow to interpret
Refrepo:tagThe image reference as it runs in a pod. Pinning to a digest is safer than a moving tag.
PackagescountOS and language packages the scanner found inside the image layers.
Critical / HighcountsDistinct CVEs in the image by severity. A high count on a widely-run base image is fleet-wide risk.
Last scannedtime / errorWhen Trivy last analysed it. A scan error (an image it couldn't pull) is shown, so a blind spot never hides silently.

Image detail (drill-down)

Open an image for its full package list and per-package CVEs, plus a blast-radius graph: every pod, node, and cluster that runs this image — so you see exactly what one vulnerable image reaches before you patch it.

Image detail
Image packages, CVEs, and the blast-radius graph of everything the image reaches.

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.

The list filters to the hygiene signal you care about — expired, expiring within 30 days, self-signed, or weak key (< 2048-bit) — so a rotation queue is one click away.

Licenses

License aggregation across every component in the fleet. DevInt reads the license declared in each package's metadata and rolls it up, so you can answer "what licenses are we shipping, and where" in one place — the compliance flip-side of the SBOM.

Licenses
License distribution across the fleet, each row expandable to its components.
FieldValuesHow to interpret
LicenseSPDX id / unknownMIT, Apache-2.0, GPL-3.0… unknown means the package declared none — worth a look for anything you redistribute.
ComponentscountHow many distinct packages carry this license. Click to see exactly which, on which nodes.

Copyleft licenses (GPL/AGPL) on something you ship are the ones to review first; a click drills into the packages and nodes that carry them.

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.

Topology

The interactive graph view of a cluster: its namespaces, pods, the images they run, and the nodes that serve it — the same Apache AGE graph the query engine traverses, drawn so you can see relationships instead of reading rows.

Topology graph
Cluster topology — namespaces, pods, images, and serving nodes as a live graph.

Nodes and edges are colored by posture, so a vulnerable image or a privileged pod stands out at a glance. The graph is lazy-loaded, so large clusters stay responsive.

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.

Capabilities

The self-describing catalog of everything DevInt can detect and do — every collector, every finding type, every enrichment source — with its status. It answers "what does this platform actually cover?" without reading the source, and doubles as the map from a finding category to the collector that produces it.

Capabilities catalog
The platform capability catalog: detections, collectors, and enrichment sources.

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.

Audit log

An append-only record of every operator action on the platform — tokens minted and revoked, drift acknowledged, alerts actioned, settings changed. Who did what, when, and to which object.

Audit log
Append-only operator audit trail, newest first.
FieldValuesHow to interpret
Actione.g. enroll_token.create, drift.ack, alert.actionThe operation performed, namespaced by object type.
Actoroperator subjectThe authenticated identity from the OIDC token — traceable to a real person.
Object / Whenid · timestampWhat it acted on and exactly when. Entries are never edited or deleted.

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.
net.ifaceNetwork posture — interfaces, addresses, DNS resolvers, and gateways (context, not a finding).

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. The same pipeline covers container images: every distinct image running in a cluster is inventoried by Trivy and matched identically, so image CVEs sit right beside host 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.

Beyond CVEs — the other finding classes

The same data spine carries more than package CVEs, and they all land in one model:

  • Read-only security findings from the host collectors above (Security) — priv-esc, SSH hygiene, exposed ports, supply-chain tamper — and the cluster collectors (RBAC, privileged pods, NetworkPolicy).
  • Container-image CVEs from the Trivy scan of every observed image (Images).
  • Certificate hygiene — expired, expiring, self-signed, and weak-key certificates, computed over the fleet's certificate inventory.
  • Drift — what changed between two inventories, with fleet-relative attribution: a change unique to one node reads as manual/out-of-band, one spread across the fleet reads as an automated rollout, and an integrity mismatch is flagged suspicious (Drift).
  • Third-party tool findings — an EDR/scanner's own detections, normalized alongside DevInt's, plus the coverage gaps where a tool should be reporting but isn't (Integrations).

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.