Events & tracing
Every Versionx operation emits structured events. The same stream feeds the CLI's progress output, the TUI dashboard, the daemon's RPC notifications (forwarded to CLI/TUI/web/MCP clients), OTLP export, and the state DB's run history.
Enabling
On stderr (human-friendly)
VERSIONX_LOG=debug versionx sync
As newline-delimited JSON
versionx sync --output ndjson | jq
Over OTLP
export VERSIONX_OTLP_ENDPOINT=http://localhost:4317
versionx sync
Event shape
{
"id": "uuid-v7",
"timestamp": "2026-04-18T14:02:17.123Z",
"kind": "adapter.exec.stdout",
"level": "info",
"message": "pnpm install",
"data": { }
}
Kinds emitted today
Scanner found 15 distinct kinds across the workspace, grouped below by top-level category.
adapter
adapter.exec.completeadapter.exec.start
config
config.detect.startconfig.init.complete
release
release.apply
runtime
runtime.download.completeruntime.download.startruntime.install.completeruntime.install.startruntime.resolve.fetchruntime.resolve.startruntime.verify.completeruntime.verify.fetchruntime.verify.skipped
state
state.backup
Consumption
From an AI agent
Agents connected via MCP receive events as progress notifications on streaming tool calls.
From Rust (SDK)
use versionx_sdk::{Core, EventBus};
let bus = EventBus::new();
let mut rx = bus.subscribe();
let core = Core::builder().event_bus(bus).build().await?;
tokio::spawn(async move {
while let Ok(event) = rx.recv().await {
if event.kind.starts_with("policy.") {
eprintln!("{event:?}");
}
}
});
From a shell
versionx sync --output ndjson \
| jq 'select(.kind | startswith("adapter."))'
See also
- Design principles — principle 8, observability.
- Environment variables —
VERSIONX_OTLP_*settings.