Sequences, not single events
This, then that, on the same host or across hosts, within a window: SASE+ sequences with negation, Kleene closures, aggregates and joins. A kill chain is one rule.
Correlation rules on the event stream you already forward, outside the SIEM — sequences across hosts, judged in the time the logs happened.
Varpulis is its engine. In September 2026 the platform around it — the server, the cluster, the SaaS layer and its connectors — was retired in favour of Vejas, an open-source event runtime that runs a Varpulis program as a detect unit: one durable JetStream consumer over the program's sources, alerts published before input is acknowledged, state snapshotted and resumed by stream sequence after a crash. The decision and its reasons are in ADR-008.
What stayed here is what a detection engineer writes and reads: the language, its semantics, the engines behind it, the scenarios and the SIEM Evasion Lab.
event SmbConnect:
host: str
target: str
event ServiceStart:
host: str
image: str
stream LateralMovement = SmbConnect as smb
-> ServiceStart where host == smb.target as svc
.within(2m)
.emit(rule: "lateral_movement", from: smb.host, to: svc.host, image: svc.image)varpulis check lateral.vpl # ok, or the reason and the line
varpulis simulate -p lateral.vpl -e lateral.evt # every emit as a JSON lineOn a bus, the same file under detects/ in Vejas is a running unit. The getting started walks through both.
Working on detection for a SOC? www.varpulis-cep.com has the fixed-price proof of concept, and a free first step: send three of your rules, get them back ported.