The columnar database purpose-built for AI agent traces.
Quickstart · Architecture · Runbook · Contributing · Changelog
What is ZenithDB?
ZenithDB is an open source, columnar database engine purpose-built for the AI agent observability workload — long, sparse, high-cardinality JSON traces with rich text fields, late-arriving annotations, and bursty ingest. It is written in Rust, exposes HTTP / gRPC / OTLP endpoints, and speaks both SQL and ZenithQL.
Existing observability backends are built for short, structured spans and pay a 10–100× cost on this workload. ZenithDB's storage engine is built around five non-negotiable design choices that make AI traces cheap to store and fast to query:
- PAX segment format sorted by
(trace_id, start_time, span_id), with per-row offset directories on wide string columns. - Trace-locality at compaction time — every span of a trace lands in one row group.
- Late materialization in the scan operator — wide columns are never decoded for rows that didn't survive every other filter.
- Tantivy embedded inline in segments, not a separate index.
- WAL on object storage with conditional PUT, queryable on PUT-ack and merged with compacted segments at query time.
Everything else is supporting infrastructure.
Quickstart
Install (30-second start)
One line on macOS or Linux — the installer detects your OS + arch and drops the zen binary in ~/.local/bin:
curl -fsSL https://raw.githubusercontent.com/Polarityinc/zenith/main/install.sh | sh
# pin a version, or change the install dir
curl -fsSL https://raw.githubusercontent.com/Polarityinc/zenith/main/install.sh \
| VERSION=v0.1.0 INSTALL_DIR=/usr/local/bin sh
Then start a local server in seconds (in-memory catalog + local-FS object store, no Docker, no Postgres):
zen serve --config examples/zenithdb.dev.toml
# HTTP :8080 | gRPC :50051 | data under ./data/
Build from source
If you'd rather build it yourself (or install.sh has no release for your platform yet):
- Rust 1.87+ (stable)
protoc3.21+ (brew install protobufon macOS,apt-get install protobuf-compileron Debian/Ubuntu)
git clone https://github.com/Polarityinc/zenith.git
cd zenith
cargo build --release
# Default profile: in-memory `MockCatalog` + local-FS object store. No Docker required.
cargo run --release -p zen_cli -- serve --config examples/zenithdb.dev.toml
The server listens on :8080 (HTTP) and :50051 (gRPC). Data lives under ./data/.
Ingest and query
# Ingest a trace
curl -s localhost:8080/v1/ingest -H 'content-type: application/json' -d '{
"trace_id": "01HZ...",
"spans": [{
"span_id": "01HZ...A",
"name": "agent.run",
"start_time": "2026-05-07T12:00:00Z",
"attributes": {"model": "claude-opus-4-7", "tokens": 4321}
}]
}'
# Query with SQL
curl -s 'localhost:8080/v1/query' -H 'content-type: application/json' -d '{
"sql": "SELECT model, count(*) FROM spans WHERE start_time > now() - 1h GROUP BY model"
}'
Production-like local stack (Postgres + MinIO)
docker compose -f deploy/docker/docker-compose.dev.yml up -d
ZEN_PROFILE=prod-like cargo run --release -p zen_cli -- serve
Architecture
Clients (SDKs, OTLP, REST, gRPC)
│
▼
Gateway (axum + tonic)
│ │
ingest queries
│ │
Writer Querier
(memtable) (planner + exec)
│ │
▼ ▼
Catalog (Postgres)
│
▼
Object storage (local-fs / S3 / GCS / Azure)
- WAL (.wal)
- Segments (.zseg)
The workspace is 18 Rust crates under crates/. The five "moat" crates that contain the engine's defining work:
| Crate | What it does |
|---|---|
zen_format |
PAX segment encoder/decoder, FSST/ZSTD/Gorilla/FoR/RLE/dict codecs, footer & offset directory layout. |
zen_compactor |
Streaming k-way merge compactor that enforces trace-locality. |
zen_query |
Vectorized scan operator, late materialization, predicate pushdown. |
zen_fts |
Tantivy-as-a-library embedded inline in segments. |
zen_wal |
Object-storage WAL with conditional PUT, queryable on ack. |
The remaining crates (zen_storage, zen_memtable, zen_catalog, zen_index, zen_jsonpath, zen_vector, zen_compress, zen_server, zen_cli, zen_cluster, zen_auth, zen_crypto, zen_proto, zen_ql, zen_bench, zen_common) are supporting infrastructure.
Configuration
The default profile runs entirely on your laptop with no external services:
- Catalog — Postgres (production) or in-memory
MockCatalog(dev/test, set in config) - Object store — local filesystem at
./data/blobs/ - NVMe page cache — in-process, default 4 GiB
See examples/zenithdb.dev.toml for the full config surface, and docs/RUNBOOK.md for production tuning.
Console (web dashboard)
ZenithDB ships with a minimal Next.js console under web/ that
talks to the engine's HTTP API. It exposes live segments, queries,
compactions, WAL metrics, and a query runner — no fixtures, all real
data.
cd web
bun install
bun dev # http://localhost:3000
Configure the upstream via ZENITH_URL (default http://localhost:8080).
Documentation
- Architecture — deep dive on the five moat crates and the design choices.
- Runbook — operator's guide.
- Examples —
zenithdb.dev.tomlconfig + Python and TypeScript quickstarts. - Changelog — what landed when.
- Contributing — dev setup, conventions, PR workflow.
- Security — vulnerability disclosure.
- Code of Conduct — community standards.
Status
ZenithDB is alpha. The core engine is feature-complete and runs the full benchmark suite, but on-disk format and wire protocols may still change before 1.0. Track the CHANGELOG for breaking changes.
Community
- Issues & feature requests — GitHub Issues
- Discussions — GitHub Discussions
- Security disclosures — see SECURITY.md
- Contact — [email protected]
Comments