The probe agent learns to watch from inside.
The addons agent has one job: watch your infrastructure from a box that isn’t part of it, so an outage your app can’t log still becomes an alert. That job hasn’t changed. But as of 0.2.0, the same binary has a second one — installed on the box you care about, it watches from inside, continuously, at the kernel.
Sensors, not checks
A check runs on a schedule: every sixty seconds, ask the question, report the answer. That’s the right shape for “is the site up” and the wrong shape for “did someone just change my firewall” — a rule added and removed between two runs never existed as far as a poll is concerned.
Sensors don’t poll. The agent subscribes to the kernel and reports the
moment something happens. Seven ship in 0.2.0, all Linux, all off until
agent.enable_sensors names them:
nftwatch— the nftables ruleset, reported the instant it changes. A rule added at 3 a.m. is an alert, not a surprise in next week’s audit.network— every inbound TCP connection attempt, seen by a pass-only eBPF/XDP program that can observe but has no drop, redirect, or rewrite path.authwatch— SSH and sudo authentication events out of the system journal, strictly matched against the distribution’s exact message forms rather than guessed at.filewatch— an explicit set of files and shallow directories. inotify is only the wake-up; every event settles into a full reconciliation, so an atomic editor replace is a confirmed change, not a missed one.listeningports— the kernel’s own socket inventory against a baseline you declare. A listener that appeared without being declared is an event; so is one that vanished.servicewatch— an explicit list of systemd units: failures, recoveries, restart loops, changed unit files, and a service whose command quietly became a different binary.pressure— kernel PSI stall triggers for CPU, memory, and I/O. The kernel wakes the sensor only when workloads were actually stalled past your threshold; one event per crossing, one per recovery.
Sensor events travel the same ingest plane as everything else, so there’s nothing new to learn on the alerting side: your rules threshold them, repeats collapse, ladders escalate, your phone rings.
What never leaves the box
Every sensor was built with the same rule: send the fact, not the material.
nftwatch sends ruleset hashes and object counts — never your rules.
network aggregates by port and redacted remote prefix — packet payloads
and exact addresses never enter an event. authwatch never sends usernames
or raw journal lines, and reduces remote addresses to a /24 or /64 before
they leave the host. filewatch sends type, owner, mode, and SHA-256 —
never contents. servicewatch sends no journal text, command lines, or
unit-file contents.
Privileges follow the same posture. The agent’s stock systemd unit keeps an
empty capability set; the kernel-attached sensors each get one narrow
capability through a local drop-in you write (CAP_NET_ADMIN for
nftwatch, CAP_BPF plus CAP_NET_ADMIN for network), and the
release’s own VM test suite proves each capability is necessary by removing
them one at a time. Several sensors need nothing added at all.
Two new checks, while we’re at it
The scheduled side grows too. hostmetrics reads CPU time, load
averages, memory and swap gauges, and paging rates straight from /proc —
unprivileged, with thresholds living in tower rules where they can match
your workload instead of a hardcoded 80%. securityupdates reports
pending updates and security updates from apt, whether a reboot is
required, and how stale the package metadata is — an unpatched box and a
mirror that stopped syncing are both a rule away from paging someone.
Signed by hardware now
0.2.0 also changes how releases are signed. The signing key no longer
exists as a file anywhere — it’s resident on a hardware token and can’t be
extracted from it. Verification got easier at the same time: signatures are
SSH signatures, so the stock ssh-keygen already on your machine checks
them, with nothing to install. The download section
has the two commands.
Turn one on
agent:
enable_sensors: [nftwatch, network]
sensors:
- id: host-firewall
sensor: nftwatch
with: { netns: host, settle: 250ms, reconcile: 5m }
- id: public-ingress
sensor: network
with:
interfaces: [eth0]
direction: ingress
ports: [22, 80, 443]
window: 60s
The addons page has the full tour, download, and verification;
the agent-readable version at /addons/index.md means
your AI agent can do the whole setup for you. And the agent’s heartbeat now
reports sensors, sensor_events, and sensor_failures about itself — so
a sensor that stops sensing is, of course, just one more rule.