
Single-host runtime-security dashboard on eBPF — Go agent + SvelteKit. Live process tree, network map, and rule-based alerts for plain Linux hosts.
The kernel-level visibility of Falco, with the live UI the kernel-native tools don't ship.
Quickstart · Spec · Views · Roadmap
Kestrel traces kernel events (process exec, file access, network connections)
with an eBPF agent and streams them to a SvelteKit web app that renders
a live activity feed, process tree, host overview, and a rule-based alert
engine. See SPEC.md for the full product/architecture document
and AGENTS.md for the operational guide.
The eBPF ecosystem is backend/CLI/Kubernetes-operator shaped. Falco — the CNCF-graduated standard — famously ships no UI of its own. The gap between "the kernel emits rich data" and "a human can actually read it" is the full-stack sweet spot this project lives in. Deliberately single-host (not Kubernetes) and observe-only (no enforcement) in v1.
flowchart TB
subgraph host["Linux host · VM in dev, VPS in prod · kernel ≥ 5.8"]
direction TB
probes["eBPF probes (C)<br/>execve · openat · connect"]
agent["Go agent — cilium/ebpf<br/>decode · enrich · batch"]
ingest["/api/ingest<br/>Zod-validated at the boundary"]
rules["rule engine"]
hub["live hub"]
db[("Postgres<br/>events · rules · alerts")]
dash["SvelteKit dashboard<br/>live feed · tree · overview"]
probes -- "ring buffer" --> agent
agent -- "HTTP POST · JSON (Zod contract)" --> ingest
ingest --> db
ingest --> rules
ingest --> hub
hub -- "SSE" --> dash
end
The key deployment constraint: the agent needs a real kernel, so it
cannot run on Cloudflare Workers (V8 isolates, no kernel). v1 co-locates
agent + app + Postgres on one host. See SPEC.md §2.
Phase 3 — in progress. Phase 2 must-haves (live feed, process tree, host
overview) are complete and verified live in the VM: the eBPF agent (execve +
exit, cilium/ebpf) traces a real kernel and streams events to the app, seeding
the tree with a /proc snapshot at startup. Phase 3 so far: the agent gained
file-open (openat) and outbound-connection (security_socket_connect)
probes (compile-verified; load-test pending in the VM), and the network map
(8.3) is built — a D3 force-directed process↔destination graph. Next up: the
sensitive-file monitor (8.4) and the rule engine + alerts (8.5). Probe work
stays in the dev VM, never the host.
Depth on a few views beats breadth done shallowly — six crisp views, built in priority order (must-haves first).
execve probe → ring buffer → cilium/ebpf → /api/ingest (in the VM)exit probe + /proc snapshot · process tree · host overviewnixosTest kernel integration test · GitHub Actions CIcd app
pnpm install
pnpm dev # http://localhost:5173
The app runs on the host; the agent runs in the dev VM and ships events to it.
To see a populated feed without the agent, opt into the synthetic generator:
KESTREL_SYNTHETIC=1 pnpm dev.
pnpm check # svelte-check (types)
pnpm test # vitest — schema + ingest unit tests
pnpm build # production build (adapter-node)
The dev/test database is PGlite (Postgres compiled to WASM): no native
build, no separate server, same SQL dialect as the prod Postgres. It persists
to app/kestrel-pgdata/ (gitignored); tests use an ephemeral in-memory DB.
# stream events (leave running in one terminal)
curl -N http://localhost:5173/api/stream
# post an event (in another) — appears live in the stream and the browser
curl -X POST http://localhost:5173/api/ingest -H 'content-type: application/json' \
-d '[{"host":"demo","type":"exec","pid":42,"comm":"bash","cmdline":"bash -i"}]'
Three tiers, matched to where each class of bug lives (full detail in
SPEC.md §6–§7):
fast-check drives the Zod event contract
with adversarial/malformed events and asserts rule-engine invariants: no false
match, deterministic verdicts, malformed input rejected at the boundary.Today: Vitest units (schema, ingest, overview, process tree, network graph) +
the agent's procscan parser and event decode helpers. Run pnpm test in
/app, go test ./... in /agent.
SPEC.md §8.11).SPEC.md §8.10).cilium/ebpf vs libbpfgo — pure Go, CGO_ENABLED=0, bpf2go workflow.SPEC.md §10).SPEC.md §6).| Path | What |
|---|
/app | SvelteKit app — event schema, ingest, SSE hub, dashboard views. Built & runnable. |
/agent | Go userspace agent + eBPF C probes (execve/exit/openat/connect) + /proc snapshot. Built; runs in the VM only. |
/infra | Nix dev VM (built) + nixosTest, Terraform/libvirt provisioning (Phase 4). |
SPEC.md | Authoritative product & architecture spec. |
| View | The question it answers | Status |
|---|
| Live activity feed (8.1) | What's happening right now? | ✅ built |
| Process tree (8.2) | What spawned what? | ✅ built |
| Host overview (8.6) | One-screen status? | ✅ built |
| Network map (8.3) | What is this host talking to? | ✅ built |
| Sensitive-file monitor (8.4) | Did anything touch the files that matter? | ◻️ planned |
| Alerts & rules (8.5) | Tell me when something looks sketchy. | ◻️ planned |