Small jobs,
done well.
One small, fast process on io_uring. Three shapes of data. Everything speaks REST, down to the single record. Your friendly neighborhood database.
Slim relational.
Tables, indexes, views and left joins for the facts that have a fixed shape. A row can point at a key or a document in the same domain.
- /sql
- row endpoints
- CSV · TSV import
- KVREF · JSONREF
$ curl -X POST localhost:3000/store-api/sql/shop \ -H "Authorization: Bearer $KEY" \ -d 'SELECT c.name, o.total FROM orders o LEFT JOIN customers c ON c.id = o.customer WHERE o.total > 40' → rows, as JSON
$ curl -X PUT localhost:3000/store-api/json/shop/docs/order-17 \ -H "Authorization: Bearer $KEY" \ -d '{"total": 42.5, "items": ["mug", "socks"]}' HTTP/1.1 200 OK ETag: "1" $ curl 'localhost:3000/store-api/json/shop/search?q=items:mug' \ -H "Authorization: Bearer $KEY"
JSON documents.
Versioned documents with ETag for the data that arrives as it is: webhooks, catalog attributes, agent context. Index it, search it, load it in bulk.
- secondary indexes
- search queries
- NDJSON bulk load
- ETag · If-Match
Key-value.
Sessions that expire on their own, flags that flip live, counters and state. A resumable watch stream tells your services the moment a key changes.
- TTL
- prefix listings
- watch over SSE
- bulk delete
$ curl -X PUT localhost:3000/store-api/kv/shop/keys/session:42 \ -H "Authorization: Bearer $KEY" -H "X-TTL: 3600" -d 'alice' $ curl -N localhost:3000/store-api/kv/shop/watch?prefix=flag: \ -H "Authorization: Bearer $KEY" event: put data: {"key":"flag:checkout","value":"on"}
No driver. No protocol. Just a URL for every record.
https://db.example.com/store-api/kv/shop/keys/session:42
Every language and every standard tool can talk to LuraDB out of the box: curl, a browser, a shell script, your framework's HTTP client. HTTP, native HTTPS or a Unix domain socket on the host. API keys with per-domain permissions. An event stream, metrics and health on the same port.
And for the newest kind of client, a built-in MCP server: AI agents get the same domains, the same permissions, and a real place to keep state, context and facts.
Your own service
one package, one unit, a REST API it talks to directly
Sessions that clean up after themselves
no Redis on the side
Memory for your agents
keys for state, documents for context, tables for facts
Flags that flip live
no redeploy, no polling
The webhook inbox
catch every payload as it is
One customer, one domain
its own keys, its own permissions
On the host, out of the way
Unix socket, systemd, journald
Rust.
On GitHub.
Opens up.
The source is public, releases ship as a .deb, the changelog marks every API change. Functional Source License 1.1: each release becomes Apache 2.0 two years after it ships.
Not Oracle, PostgreSQL or MySQL. Not MongoDB, Cassandra or Spark. No analytical engine, no cluster, no data-warehouse ambition.
Linux + io_uring + async. The letters the architecture is built on.
A write is confirmed only once it is in the write-ahead log. A failed fsync stops the service; the next start recovers from the log.
Two minutes to a running database.
Install the package
$ sudo apt install ./luradb_*.debapt resolves the dependencies, creates the system user and generates the admin key. Linux amd64, kernel 6.1 or newer.
Start the service
$ sudo systemctl start luradbUnder systemd, logging to journald. Review the config first if you like: bind address, data paths, HTTPS.
Curl it
$ curl localhost:3000/health {"status":"ok","version":"0.5.1", …}Then the first five minutes in the handbook: a key, a document, a table. No Linux machine handy? Docker works too.