Evidence-first vector database for citation-grade RAG.
DASH stores atomic claims with provenance, retrieves them with citation-grade rankings, and ships an OpenAI-compatible embeddings endpoint so any client can adopt it without changing call sites.
# Drop-in OpenAI-compatible embeddings
curl -X POST http://localhost:8080/v1/embeddings \
-H "Content-Type: application/json" \
-d '{"input": "Company X acquired Company Y", "model": "text-embedding-3-small"}'import openai
client = openai.OpenAI(base_url="http://localhost:8080/v1", api_key="not_needed")
resp = client.embeddings.create(input="hello world", model="text-embedding-3-small")
print(resp.data[0].embedding[:5])Production-ready in this release:
- OpenAI-compatible
/v1/embeddingsendpoint (wire-byte compatible with the OpenAI spec) - Semantic-first retrieval (
InMemoryStore::retrieve_semantic) with dense-similarity as the primary ranking signal - Env-driven real embedding providers:
DASH_EMBEDDING_PROVIDER=hash|ollama|openai redbpersistence (PR 1, additive, default off; enable withDASH_*_PERSISTENCE_PATH)- SDKs: Python (
dash-py), Go (dash-go), TypeScript (dash-ts) — all OpenAI-drop-in compatible cargo-fuzzharnesses for JWT, OpenAI parser, ranking, and WAL parser- Performance benchmark suite (
perf_bench): ingest, retrieve-lexical, retrieve-semantic, ANN-at-scale, WAL-replay - Docker + docker-compose (multi-arch, non-root, healthcheck)
- Hash-chained audit log, per-tenant rate limiting, JWT auth + scoped API keys, OpenAI drop-in
Test counts: 379 Rust unit/integration tests passing, plus 86 Go + 65 TypeScript + 59 Python = 589 tests total across the workspace. cargo clippy --workspace --all-targets is clean. cargo build --workspace is clean.
See CHANGELOG.md for the full deltas and docs/quickstart.md for the 5-minute path.
Naive RAG ranks documents by vector similarity and returns the top k chunks. That works for "summarize this article" but fails in three common enterprise cases: (1) two sources say opposite things and you have no way to demote the contradicted one, (2) a fact has a temporal window and the version you retrieved is stale, (3) your auditor asks "why did the model say that" and the answer is "because a 768-dimensional number was close to a query." DASH treats the claim — an atomic, source-bound assertion — as the primary data primitive, with evidence and citation as first-class fields on every result.
Concretely, every retrieval response in DASH is { claim, score, supports, contradicts, citations[] }. Each citation carries its source_id, stance (supports/contradicts/neutral), source_quality, and an optional chunk_id plus span_start/span_end for character-level traceability. The retrieval API exposes stance_mode: support_only to filter out claims that have been contradicted, and time_range: {from_unix, to_unix} to constrain results to a validity window. This makes DASH a different kind of vector database: not the fastest pure vector index, but the most defensible one for RAG that has to ship to legal, medical, financial, and enterprise knowledge workflows.
The five-minute path from clone to retrieval query. Requires Docker.
git clone https://github.com/anomalyco/dash.git
cd dash
docker compose -f deploy/container/docker-compose.yml up -dIngest a claim with its supporting evidence:
curl -X POST http://localhost:8081/v1/ingest \
-H "Content-Type: application/json" \
-d '{
"claim": {
"claim_id": "c1",
"tenant_id": "t1",
"canonical_text": "Company X acquired Company Y",
"confidence": 0.95
},
"evidence": [{
"evidence_id": "e1",
"claim_id": "c1",
"source_id": "news://nyt",
"stance": "supports",
"source_quality": 0.95
}],
"edges": []
}'Retrieve with citations, dropping any claim that has been contradicted:
curl -X POST http://localhost:8080/v1/retrieve \
-H "Content-Type: application/json" \
-d '{
"tenant_id": "t1",
"query": "Company X acquired Company Y",
"top_k": 5,
"stance_mode": "support_only"
}'Use the OpenAI-compatible /v1/embeddings endpoint from any OpenAI SDK — langchain, llama-index, the openai CLI — by setting OPENAI_API_BASE=http://localhost:8080/v1. See docs/quickstart.md for the full path including building from source, Python examples, and the contradiction-handling walkthrough.
- Claim + Evidence + Edge data model with first-class citation provenance (
source_id,stance,source_quality,chunk_id,span_start,span_end,doc_id,extraction_model). - Contradiction handling:
Stance::Contradictson evidence andClaimEdge { relation: Contradicts }demote results;stance_mode: support_onlyfilters them out. - Temporal validity windows:
event_time_unix,valid_from,valid_toon every claim, withtime_rangefiltering on the retrieval API. - OpenAI-compatible
/v1/embeddings: byte-compatible request/response with the OpenAI v1 embeddings API. Default provider isHashEmbeddingProvider(deterministic, no network); swap for Ollama, OpenAI, or any custom backend by implementing theEmbeddingProvidertrait. - HNSW ANN via
usearchfor vector candidate generation, withDASH_*_ANN_*tuning knobs and a graph-backed recall layer on top. - Durable WAL with replay, checkpoints, and compaction in
pkg/store. WAL durability guardrails reject unsafe flush policies by default; an explicitDASH_INGEST_ALLOW_UNSAFE_WAL_DURABILITY=trueoverride is required for stress testing. - Hash-chained audit log: every authenticated state change is recorded as a SHA-256-chained JSON line; verify with
scripts/verify_audit_chain.sh. - Per-tenant rate limits, scoped API keys, and key revocation with
DASH_*_RATE_LIMIT_*,DASH_*_SCOPED_API_KEYS, andDASH_*_REVOKED_API_KEYS. Multi-tenant tenant allowlist enforced in the authz layer. - JWT auth (HS256) with key rotation by
kid, optionaliss/audchecks, fallback secrets list, and per-tenant claim enforcement. - Open source — see the
LICENSEfile (the intended license is Apache-2.0, pending confirmation before the first tagged release). Fully auditable core, no vendor lock-in, no telemetry. - Operational scripts: backup, restore, recovery drill, failover drill, SLO guard, release-candidate gate, audit chain verifier — see
scripts/. - Benchmark suite with
smoke,hybrid, andlargeprofiles and a CI-enforced regression guard against prior scorecards.
DASH vs other vector databases on the dimensions that matter to RAG users. See docs/comparison.md for the full table and "when to use / when not to use" guidance.
| Dimension | DASH | Pinecone | Weaviate | Milvus | Qdrant | Chroma |
|---|---|---|---|---|---|---|
| Open source | yes | no | yes (BSD-3) | yes (Apache-2.0) | yes (Apache-2.0) | yes (Apache-2.0) |
| Claim + Evidence model | first-class | no | no | no | no | no |
| Contradiction handling | first-class | no | manual | no | no | no |
| Temporal validity windows | first-class | metadata | manual | manual | manual | manual |
OpenAI-compatible /v1/embeddings |
yes | limited | yes | proxy | proxy | yes |
| Hash-chained audit log | yes | no | no | no | no | no |
| Tenant rate limits | yes | yes | yes | yes | partial | no |
| JWT + scoped API keys + revocation | yes | JWT only | OIDC | yes | partial | no |
| RAG-specific primitives | yes | no | modules | no | no | no |
DASH is a Rust workspace organized into library crates (pkg/schema, pkg/store, pkg/ranking, pkg/graph, pkg/auth, pkg/embeddings) and four service binaries (services/ingestion, services/retrieval, services/indexer, services/control-plane). Ingested claims are durably written to a write-ahead log, replayed into an in-memory Claim + Evidence + Edge store, and indexed for HNSW ANN candidate generation. The retrieval path runs a planner that combines ANN candidates with metadata filters, time-range filters, stance demotion/filtering, and optional graph expansion, then projects results into a citation-bearing response. JWT and scoped-API-key authz is enforced in the transport layer; per-tenant rate limits and a hash-chained audit log are emitted alongside every state change. The full design — including the data model, WAL/snapshot protocol, retrieval planner, and operational model — lives in docs/architecture/eme-architecture.md.
Done (in this tree):
- Claim + Evidence + Edge schema, validation, and serde round-trips
- WAL with replay, checkpoints, compaction, and durability guardrails
- HNSW ANN via
usearchwithDASH_*_ANN_*tuning - Retrieval API with
BalancedandSupportOnlystance modes, time-range filtering, optional graph payload - OpenAI-compatible
/v1/embeddings - Per-tenant authz, scoped keys, revocation, rate limits
- Hash-chained audit log with chain verifier
- HS256 JWT with kid rotation,
iss/aud, fallback secrets - Benchmark suite with CI regression guard
- Docker Compose and systemd unit files
Next (active development):
- Larger-scale ANN recall/quality tuning and benchmarking at 10M+ claim corpora
- Full segment lifecycle integration in the retrieval hot path
- Distributed shard + replication protocol (placement router is wired; production-ready replication path is not)
- Auth federation (OIDC), broader key-rotation story
- Pluggable embedding backends (Ollama, OpenAI passthrough) as a first-class
EmbeddingProviderexample set - JavaScript/TypeScript and Go SDKs
Contributions are welcome. See CONTRIBUTING.md for the workflow, code standards (clippy enforced at -D warnings, fmt enforced in CI), RFC process, and "good first issue" list. All new code must pass cargo test --workspace and ./scripts/ci.sh.
DASH is source-available software. The intended release license is Apache-2.0, pending confirmation before the first tagged release. Until a LICENSE file is added at the repository root, the actual terms are those stated in the repository's README.md and CONTRIBUTING.md.