Lucas RayanandClaude Sonnet 5 be47b607df
Release / Plan (reuse the published image?) (push) Successful in 4s
CI / Docker image (build and smoke test) (push) Skipped
CI / Format and clippy (push) Successful in 16s
CI / Dependency audit (push) Successful in 17s
CI / Tests (Linux) (push) Successful in 34s
Release / ci (push) Successful in 35s
Release / Build image (arm64) (push) Successful in 4m55s
Release / Build image (amd64) (push) Failing after 11m10s
Release / Publish tags (push) Skipped
Release / Gitea release (push) Skipped
feat: build a real dashboard and fix dead panel navigation in the web UI
The sidebar nav (Overview/Alerts/Analysis) only did scrollIntoView on a
single stacked page, so clicking it produced no visible change. The
Alerts/Analysis panels were also placeholder shells with no real data
exploration despite the API already exposing rich per-pillar evidence.

- app.js/app.css/index.html: real panel switching via showView()/currentView,
  toggling an .active class with `.view:not(.active) { display: none }`;
  settings keeps opening its own dialog without disturbing the active view.
- New Hosts panel: table of observed hosts ranked by fusion score, with
  per-pillar (P1/P2/P3) columns, search, and drill-down into each pillar's
  evidence. Documents the known limitation that /api/alerts only lists hosts
  with at least one alert (no /api/hosts endpoint exists yet), so a benign
  host with no alert won't appear.
- Alerts panel: filterable by pillar and minimum score, sortable, with
  full evidence rendered as a formatted key/value table instead of raw JSON.
- Overview panel: KPI tiles (alert count, hosts with alerts, max score,
  dataset records) plus two interactive SVG charts (top hosts by fusion
  score, alert distribution by pillar) with hover tooltips.
- i18n-en.js: English strings for all new UI text.

No Rust files changed; this is purely apps/gui/ui/ consuming the existing
/api/alerts, /api/analyze and /api/status endpoints.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VAyr8d7HuAdUGB6aA5xmDD
2026-11-01 08:28:08 -03:00
2026-10-31 10:20:03 -03:00
2026-10-31 10:20:03 -03:00
2026-10-31 10:20:03 -03:00
2026-10-31 10:20:03 -03:00

Acauã

Acauã

Deterministic network threat hunting.
Zeek-first NDR research · local-first · authorized use.

Terminal · Interface · Architecture · Docker · Support · Roadmap · Changelog

English · Português


Status: pre-release (initial version). The project structure, documentation, CI, Zeek ingestion for conn.log and dns.log, DuckDB/Parquet analytical storage, and initial versions of detection pillars 1 to 4 are implemented and validated against public traffic. Automatic continuous ingestion and cross-restart alert persistence are planned for upcoming releases.

Acauã is a network threat hunting engine built around deterministic evidence, not an opaque model. The goal is to answer not only "this looks suspicious" but "these exact inputs, with these intermediate values, produced this score".

  • Deterministic by design: fixed-order reductions, documented sentinels and a JSON evidence record for every future alert.
  • Local-first: the analytical store is embedded in the process; no external database and no telemetry by default.
  • Zeek-first: dns.log, ssl.log, conn.log and the protocol logs needed for identity and lateral-movement analysis. NetFlow/IPFIX is a documented degraded mode, never presented as equivalent. Suricata EVE JSON is an optional secondary input.
  • Server daemon and web dashboard: acaua serve runs continuous ingestion, scheduling, the API and the embedded web UI, distributed 100% via Docker.
  • Research stays outside the product: research/ is an isolated Python workspace for scientific validation and fixtures. It is never compiled, packaged or released.

What exists today

Area State
Rust workspace and CLI (acaua) ✅ functional
Axum API with health, status, alerts and analyze routes ✅ functional
Embedded web dashboard ✅ UI served by daemon
Documentation and CI/release workflows ✅
Docker multi-arch image and compose deployment ✅
DuckDB analytical store ✅ official prebuilt library linked
Four detection pillars (P1–P4) ✅ initial version
Zeek log parser (conn.log, dns.log) ✅ functional
Alert evidence and scoring ✅ deterministic JSON + noisy-OR fusion
Published releases ❌ none yet

The four pillars

All four pillars are implemented in their initial version (v1) and validated against synthetic fixtures and public captures:

  1. Beaconing (Pilar 1 v1.2): periodicity on event timestamps with a Rayleigh/Schuster periodogram bounded by the observed span, regularity significance gating, and infrastructure exclusions.
  2. Persistent sessions (Pilar 2 v1.0): long TCP connections chained across Zeek inactivity timeouts (up to 3600s gap without new SYN), log-scale persistence score, and PCR/failed attempt tracking.
  3. Protocol anomalies (Pilar 3 v1.0): deterministic information capacity (Shannon entropy \times unique subdomain characters per UTC hour) in DNS queries to detect tunneling.
  4. Evidence fusion (Pilar 4 v1.0): per-host weighted noisy-OR combination (w_1=w_2=w_3=0.75) with deterministic JSON evidence and ranking.

The design decisions behind these pillars, including the six corrections to the original blueprint, are in docs/architecture.md.

Authorized use

Acauã is defensive software for networks you own or are explicitly authorized to monitor. Capturing or analyzing third-party traffic without permission may be illegal. The operator is responsible for scope, privacy and retention.

The daemon binds to 127.0.0.1 by default. The Docker Compose deployment isolates the daemon in an unprivileged, read-only container with dropped capabilities.

Install

Run via Docker Compose (recommended for operators):

cp .env.example .env
docker compose pull && docker compose up -d

Or build and run locally with Docker:

docker compose up -d --build

To compile from source natively (Rust 1.88+ required):

scripts/fetch-libduckdb.sh ~/.cache/acaua/duckdb
export DUCKDB_LIB_DIR=~/.cache/acaua/duckdb LD_LIBRARY_PATH=~/.cache/acaua/duckdb
cargo build --release -p acaua-cli
./target/release/acaua --help

Supported platform matrix for published container images: linux/amd64 and linux/arm64.

Getting started

acaua doctor
acaua serve --bind 127.0.0.1:8787 --data-dir .acaua
acaua analyze /var/log/zeek/current --json
acaua update

analyze currently validates the directory and returns a skeleton report; it does not parse Zeek logs yet. serve exposes the stub API and the embedded web UI. update checks for new versions and guides container image updates.

Development

scripts/fetch-libduckdb.sh ~/.cache/acaua/duckdb
export DUCKDB_LIB_DIR=~/.cache/acaua/duckdb LD_LIBRARY_PATH=~/.cache/acaua/duckdb
cargo test --workspace
cargo clippy --workspace --all-targets
node scripts/check-ui-i18n.mjs
scripts/check.sh --full

See CONTRIBUTING.md and docs/architecture.md.

Known limits

  • The detection engine, Zeek parser and storage layer are stubs.
  • There is no published release image yet.
  • NetFlow/IPFIX is a degraded input mode by design; it cannot replace the Zeek protocol logs for every pillar.
  • The project targets Linux container environments (linux/amd64, linux/arm64).

Where it's going

Summary of the ROADMAP:

Done Workspace, CLI/API stubs, web dashboard, Docker containerization, CI/release workflows
Next Pillar 1 and 2 implementations with deterministic fixtures; real Zeek parser
Later Full Parquet partitioning, TTL pruning, pillar 3 and 4, evidence fusion
Not planned Opaque AI scoring, a required cloud service, Python in the shipped runtime

License

MIT or Apache-2.0, your choice.

S
Description
Network threat hunting with deterministic evidence
Readme
3.1 MiB
0 Stars 1 Watchers 0 Forks
Acauã 0.1.0
Latest
2026-11-01 13:27:06 +00:00
Languages
Rust 50.9%
JavaScript 24.4%
CSS 8.4%
Python 7%
HTML 4.4%
Other 4.9%