Decipher the growth layers of your AI agent fleets.
Local-first AI Fleet Intelligence. Operational evidence for the operator.
Dendro reads authorized local harness logs and OpenRig records into embedded DuckDB. It answers questions about seat activity, handoff friction, token consumption, rework, and context carryover. It observes execution; fleet governance stays with the operator.
- Seat dynamics: five disjoint activity bands, unknown intervals retained, fleet concurrency and container hold evidence.
- Handoff flow: pickup and execution latency, return rates, parent-linked rework loops, and conservative token attribution.
- Consumption: uncached input, cache reads/writes and output, with separate reasoning detail and explicit linkage coverage.
- Traceability: reports and forensic traces share the same metric definitions, observation window and evidence keys.
Missing observations are not measured zero. Tokens do not establish value or causal productivity. Recorded cost and operator-supplied prices must be distinguished from one another.
▶ Watch the full HD video (`docs/assets/dendro-demo.mp4`) · Read the scene-by-scene script & captured outputs (`docs/VIDEO_WALKTHROUGH_v0.6.md`)
The walkthrough above is recorded from real ./target/release/dendro (v0.6.0) execution over a local OpenRig + Claude multi-seat dataset (dev-build@test-rig, rev-review@test-rig, orch-arch@test-rig), showing zero-config status preflight, the terminal activity ribbon explorer, auto-materializing conversational queries, decision tables, observational topology simulation, and one-command offline HTML dashboard export.
v0.7.0 is the operator surface on top of that evidence engine. Bare dendro still runs dendro status. The text report is a sectioned fleet brief: database coverage, discovered harness roots, seats grouped by rig, and a command reference. dendro --help adds quickstart examples, cockpit shortcuts, and report kinds.
- Cockpit:
dendro dashboardanddendro uiopen six Ratatui screens (Pulse, Seats & Timeline, Handoffs & Flow, Tokens & Cache, Topology Simulator, Trace & Spotlights) with TachyonFX transitions and an OpenTUI-style RGBA backdrop under the modals. Keys:1–6,/,x,m,v,r,w,:,i,?,q. - Entity hygiene: canonical agent seats are
<role>@<named-rig>.qitem-*ids are queue endpoints.external:,system:,@system,system,steerer, andsteer-leadare gates. Everything else, including 26-character01…ULIDs, stays unlinked. Named rigs and ephemeral ULID rigs are counted separately. - Ask: exact phrase match, then token scoring against supported intent vocabulary. Refusals suggest the closest intents.
--format text|jsonselects the rendering; a terminal defaults to text and a pipe defaults to json. - Pi: default ingest reads both OpenRig
state/piand standalone~/.pi/agent/sessions. Status reportspi_breakdownas openrig files, standalone files, linked usage, and standalone usage.
Details are in the v0.7.0 release notes.
Install stable Rust and Git, then:
git clone https://github.com/smota/dendro.git
cd dendro
cargo build --release --locked
./target/release/dendroRunning bare dendro (or dendro status) prints the fleet brief: database readiness, discovered local harness roots, rig-scoped recorded bounds, seats grouped by rig, Pi source coverage, semantic cache freshness, and the next commands.
With no --db and no --storage-root, the database is dendro.duckdb in the private default folder: %LOCALAPPDATA%\Dendro on Windows, or $XDG_DATA_HOME/dendro (default ~/.local/share/dendro) on Linux. dendro storage-init creates or verifies that folder and prints its path. If ./dendro.duckdb is in the current directory and that folder has no database yet, Dendro refuses to open it and prints the command to copy it there (PowerShell Copy-Item -LiteralPath on Windows, cp -- on Linux), including dendro.duckdb.wal when that file is beside it. Dendro does not copy or move the file. --db outside a private folder is refused the same way. When the current directory is already a private folder, ./dendro.duckdb is opened there with no extra message.
# 1. Check status, discovered local harness sources, and recorded bounds
./target/release/dendro status
# 2. Launch the interactive TUI dashboard (or --once snapshot), auto-ingesting if needed
./target/release/dendro dashboard --auto-ingest
# 3. Export the self-contained, secret-redacted, seat-aliased offline HTML dashboard
./target/release/dendro dashboard --html ./dendro-dashboard.html
# 4. Ask natural questions (auto-materializes semantic views over the active window)
./target/release/dendro ask "highest idle"
./target/release/dendro ask --format text "where do tokens go?"
./target/release/dendro ask --list-intentsInside the cockpit, press ? for the full key list. 1 through 6 select the screens. / filters seats, x reveals queue endpoints and gates, m switches the seat ribbon and timeline, v cycles the handoff heatmap, r and w cycle rig and window, : asks Nao, and i previews an issue draft.
Choose authorized source roots explicitly and keep the output database outside those roots. You can pass --window 1h|24h|7d|30d|all (anchored to the database's rig-scoped recorded bounds when data exists) or explicit half-open [from, to) RFC3339 timestamps:
./target/release/dendro run \
--root openrig=/absolute/path/to/openrig.sqlite \
--root codex=/absolute/path/to/codex
./target/release/dendro report decisions --window 7d
./target/release/dendro report decisions \
--from 2026-10-14T00:00:00Z --to 2026-10-15T00:00:00Z
./target/release/dendro trace \
--metric-id handoff_friction --window 7dDates above are examples; choose the actual period recorded by your sources or use --window. Windows are half-open [from, to). Every relative window resolution discloses "window_resolution" ("recorded_bounds", "anchored_to_recorded_data", "explicit", or "trailing_utc"). An empty report may mean absent timestamps, unsupported data, or an unobserved period. A build from source is not a measured five-minute installation guarantee.
Export a self-contained web bundle with ./target/release/dendro dashboard --html ./dendro-dashboard.html, or open the offline explorer and load a report or trace JSON file. The viewer aliases seat labels and displays supported numeric facts. Its synthetic demo is labelled. Aggregate concurrency counts are a distribution, not a reconstructed time series; handoff counts do not establish token transfer.
The landing page includes a scenario calculator. Its inputs are assumptions, and its formulas describe potential released capacity, not predicted savings or ROI.
cargo check --workspace --locked
cargo test --workspace --locked
cargo clippy --workspace --locked -- -D warnings
cargo fmt --check
node --test site/site.test.cjsThe real-local-log performance test is explicitly ignored by default and requires a separately authorized corpus. Synthetic correctness or benchmark results do not establish production-scale latency. See the benchmark's actual output and corpus before quoting a performance claim; milliseconds must not be called sub-millisecond.
- Operator guide: status, cockpit, source selection, reporting, privacy and reproducible replay.
- CLI reference and Nao & local semantic queries.
- v0.7.0 release notes, v0.6.0 release notes, and real operation video script.
- Maintainer guide: workspace architecture and quality gates.
- Connector extension guide: trait contract and runnable example.
- Product specification and R1 acceptance contracts.
- Real operation walkthrough video and preview animation.
Source logs are read-only. The analytics store uses allowlisted facts, redaction, opaque identifiers and explicit uncertainty. Never select credential files as ingestion roots. Exporting or publishing a report is a separate operator action; local storage alone does not make every possible export safe to share.
MIT License. Copyright 2026 Samuel Mota.