The databases we had were made for people writing code by hand, one job each. An agent does two jobs at once: it builds systems for you, and it keeps its own memory while it works. K3 is one engine built for both.
It needs a database that catches its mistakes and grows with the business it builds.
It needs to remember by meaning, relate by graph and recall facts exactly, in one place.
No sync pipelines between a database, a vector store, a graph and a bucket. Less to store, less to move, less to pay for.
We own the write path, the storage and the servers it runs on, in the UK with the EU next. No outside engine sets our roadmap or our price.
Every improvement lands across SQL, vector, graph and objects at once, for every customer, in one release.
An app that searches, relates and stores files usually runs four systems and the jobs that copy data between them. Every copy is a chance to be wrong. K3 keeps one copy and answers every way.
Real types, primary and foreign keys, CHECK constraints and multi-table transactions. Your ORM and BI tools connect as they are.
A vector is a column. Search it with pgvector operators, filter with WHERE, join the result like any other rows.
CREATE GRAPH over two tables you already have. Traverse with Cypher, or as a subquery inside SQL.
Files live in the same bucket. Point any S3 client at it, and turn uploads into rows and vectors with a pipeline.
K3 speaks the Postgres wire, so the models, sessions and queries you already wrote run unchanged. Point the connection string at your bucket and ship. Vector search and graph traversal come along on the same connection.
K3 is not a lake you copy data into after the fact. It is where the data lives: the same rows your app writes are the rows your search, graph and reports read.
A write is acknowledged only once it is on a replicated log in object storage.
BEGIN…COMMIT lands every statement together as one write, or none of them.
Two writers on one row resolve to exactly one winner, and the other is told to retry.
DECIMAL to 38 digits, real UUIDs, enforced VARCHAR(n) and comparison CHECKs. Bad data is refused, never trimmed.
SQL reads always include your own writes, even inside an open transaction. No replica lag to design around.
RESTORE TABLE to any version or timestamp in the last 7 days. The restore itself is versioned.
BEGIN; SELECT balance FROM accounts WHERE id IN (:from, :to) FOR UPDATE; UPDATE accounts SET balance = balance - :amt WHERE id = :from; UPDATE accounts SET balance = balance + :amt WHERE id = :to; INSERT INTO ledger (txn, account, delta) VALUES (:txn, :from, -:amt), (:txn, :to, :amt); SELECT sum(delta) FROM ledger WHERE txn = :txn; -- 0 COMMIT;
| K3 | CockroachDB | |
|---|---|---|
| Single-row INSERT | 7.6 ms | 20.5 ms |
p50 server time per statement, one client, same machine. K3 0.2.4 against CockroachDB v24 with three replicas. Every K3 write is on a replicated quorum log before it is acknowledged. October 2026 benchmark.
No second store to feed. Add a VECTOR column, index it, and filter, join and sort the results with the SQL you already write.
Indexes pick the candidates. Every result is re-ranked at full precision, so the distance you see is the true one.
Every build proves every stored vector reachable, or it fails and tells you. A quietly lossy index can’t exist.
A vector is a row. The moment the write is acknowledged, a search can find it.
HNSW, IVF and their quantized variants, picked per column with plain CREATE INDEX.
CREATE TABLE docs (id BIGINT PRIMARY KEY, body VARCHAR, embedding VECTOR(1024)); CREATE INDEX ON docs USING hnsw (embedding vector_cosine_ops); SELECT id, body FROM docs WHERE team = 'legal' ORDER BY embedding <=> :question LIMIT 5;
One bucket answers on eight protocols your tools already speak. The bucket name is the database on every one, and dodil data connect prints them all.
pg.uk-lon-1.dodil.io:5432psql · psycopg · SQLAlchemy · SQLx · GORM · node-postgresobject.uk-lon-1.dodil.ioAWS CLI · boto3 · standard S3 SDKsbolt+s://bolt.uk-lon-1.dodil.io:7687Neo4j drivers · cypher-shelltable.uk-lon-1.dodil.ioany HTTP clienttable-rpc.uk-lon-1.dodil.io:443dodil CLI · generated stubs · grpcurlqdrant.uk-lon-1.dodil.ioqdrant-clientpinecone.uk-lon-1.dodil.ioPinecone SDKsgql.uk-lon-1.dodil.io/graphqlany GraphQL clientA full copy of your bucket for every pull request, in seconds, without copying the data.
Query any table as it was at a version or a moment, right inside SELECT.
Every statement grouped by shape, with p50, p90 and p99, so the slow one finds you.
Pay for the data you keep and the queries you run, with nothing idle in between. Free to start, no card.