Every system gets a plugin.
A plugin is a Go package for one system. It reads state, takes in telemetry, publishes into the graph, and can declare the fixes it knows how to apply.
In the box.
Kubernetes
Owns API discovery and a single shared informer factory. Publishes one collection per resource type, such as pods or services, and reuses it for every plugin that asks.
Secrets arrive as metadata and a sorted list of key names. Values, type, and annotations are excluded.
- Discovery
- Remediation
Can apply: NetworkPolicy ingress isolation
Istio
Models PeerAuthentication, AuthorizationPolicy, and ServiceEntry on top of the Kubernetes plugin’s watches.
Maps waypoint OTLP access logs into bounded communication rollups.
ServiceEntry endpoint values stay out of the graph; only counts and address classes are kept.
- Discovery
- Telemetry
- Remediation
Can apply: STRICT mutual TLS with PeerAuthentication
Cilium
Reads CiliumNetworkPolicy, CiliumClusterwideNetworkPolicy, CiliumEndpoint, and CiliumNode, and enriches the matching pods and nodes instead of creating rival identities.
Normalizes Hubble network flows.
CNI state and flows only. Service mesh, Envoy, and L7 policy are out of scope.
- Discovery
- Telemetry
- Remediation
Can apply: CiliumNetworkPolicy ingress isolation
agentgateway
EarlyProjects GatewayClass, Gateway, HTTPRoute, and the Services they reference for agentgateway instances managed through Gateway API.
Maps agentgateway access logs.
Early. Expect it to change.
- Discovery
- Telemetry
AWS
EarlyInventories EC2 instances, network interfaces, and security groups in one region. It reconciles at startup and every five minutes, and CloudTrail events delivered through EventBridge and SQS trigger a reconcile right away.
Takes VPC Flow Logs straight from Amazon Data Firehose, with no collector in between.
Early. EC2 only: no routing, gateways, network ACLs, or IAM, and no fixes it can apply.
- Discovery
- Telemetry
Planned, not shipped.
Runtime signals are the next plugins. None of these are in this release.
Tetragon
Runtime events from eBPF
Falco
Runtime detections
Write one.
A plugin declares what it owns, consumes collections, and replaces its contribution as the world changes. The sample is from the plugin guide.
- Projectors are pure. Current objects in, graph input out, same result whatever the input order.
- Identity is authority plus an immutable key. Names and addresses are attributes.
- Every assertion names its source. Plugin, source, rule ID, and evidence IDs.
- Replace, never patch. Publish the complete current output. What you omit is retracted.
- Telemetry stays out of the graph. Only bounded rollups with resolved endpoints are projected.
func New() (*Plugin, error) { foos, err := kubernetes.NewResourceClient(kubernetes.ResourceRequirement{ GVR: schema.GroupVersionResource{Group: "foo.example.io", Version: "v1", Resource: "foos"}, Capability: "foo-v1", }, decodeFoo) if err != nil { return nil, err } return &Plugin{foos: foos}, nil}func (p *Plugin) KubernetesResources() []kubernetes.ResourceRequirement { return []kubernetes.ResourceRequirement{p.foos.Requirement()}}func (p *Plugin) Descriptor() discovery.Descriptor { return discovery.Descriptor{ ID: "foo", Version: "1.0.0", Description: "Foo security semantics", Consumes: []string{p.foos.Collection()}, Publishes: []string{"foo/projection"}, }}Only one plugin may publish a collection name, and every consumed collection needs a publisher. The manager checks both before anything starts.
Run it yourself.
One binary with the explorer built in. It needs PostgreSQL and something to read: a Kubernetes context, AWS credentials, or both. Reasoning is optional.
Needs Go, Node.js with pnpm, Docker, and kubectl.
export POSTGRES_PASSWORD='development-only-password'make postgres-upexport AGENTANTIBODY_DATABASE_URL="postgres://agentantibody:${POSTGRES_PASSWORD}@127.0.0.1:5432/agentantibody?sslmode=disable"make runOpen http://127.0.0.1:8088. To turn on reasoning, set a model endpoint first.
export AGENTANTIBODY_MODEL_ENDPOINT='<your OpenAI-compatible endpoint>'