Five claims. One lifecycle.

Five claims. One lifecycle.

The tenant is a first-class object. Everything else — RESP, HNSW, the dashboard — is in service of that.

01

Tenant is a first-class object

POST /api/provision creates a live isolated engine: its own data directory, write-ahead log, HNSW index, snapshot lineage, and process-level state. Isolation is structural, not a naming convention.

Provision, back up, restore, and delete operate on exactly one customer. There is no cross-tenant scan and no shared keyspace to sweep.

02

State and memory in one engine

KV with TTL (session, scratchpad, rate counters) and HNSW vectors (semantic recall) live in the same process, behind one connection, in one data directory, and inside one backup archive. An agent’s session and its recall cannot drift apart — there is no second system to drift from.

Honest limit: the periodic .rdb snapshot serializes KV only. Vectors are durable through checksummed metadata, mmap rows, and the WAL. A single atomic KV+vector point-in-time image does not exist.

03

Cost scales with active tenants

Vectors are stored as 8-bit scalar-quantized (SQ8) rows in an mmap’d file, with asymmetric distance computation at query time. Payload is roughly a quarter of float32. An idle tenant lives in page cache rather than resident RAM.

That is what makes hosting many small tenants viable. The metric is cost per active tenant — not the count of tenants you have signed.

04

Self-hosted single binary

Embeddings never leave the customer’s network. The dashboard, console, data explorer, and vector playground are compiled into the same binary. No sidecar. No separate control-plane service to deploy. No vendor to send data to.

05

Isolation Kernel

On Linux production a tenant is a sealed execution domain: its own process, a Landlock-restricted view of the filesystem, and Unix sockets that only the orchestrator can open. The WAL, checkpoints, vector ids, and the HNSW graph are encrypted under a per-tenant key. Destroying that key makes what is left on disk unreadable without a scan.

Honest limits: SQ8 vector rows stay memory-mapped and unencrypted so idle tenants remain cheap — use fscrypt or LUKS for those. Data in use is plaintext inside the worker. Re-measured density under strict: ~14–17 MiB RSS per idle worker, worst idle GET ~3–12 ms. The in-process profile shares one process and is not this claim.

On-ramp, not a USP

Your existing RESP clients work

DBX speaks RESP, so redis-py, ioredis, and go-redis connect without a custom driver. That lowers the cost of trying DBX. It is not a reason to choose DBX, and it is not a claim that DBX is a substitute for a tuned Redis cluster.

The product

Tenant lifecycle

This is the API that defines the product. Everything else is a data-plane detail. Bearer token required on every call. Click through the sequence.

Provision an isolated engine

HTTP
curl -X POST http://localhost:8000/api/provision \
  -H "Authorization: Bearer $DBX_TOKEN" \
  -d '{"id": "acme-corp", "name": "Acme Corp"}'

replicas is optional (0–2). 0 is the certified single-node path. 1 or 2 starts async WAL replicas. The primary still acks writes locally; replica lag is possible.

Same token, same tenant id:

  • GET /api/v1/tenants/{id}/usage — keys, live vectors, memory, disk, commands. The meter a billing loop should call. Orchestrator GET /metrics is Prometheus text with per-tenant labels.
  • POST /api/tenants/export / import — aliases for backup/restore. SHA-256 manifest, rollback on a failed restore.
  • POST /api/v1/tenants/{id}/hibernate and /wake — stop a cold engine, keep the directory, rehydrate later. Sentinel will not restart a hibernated tenant.

Run it locally.