Open-source engine · hosted for free
A database you talk to one line at a time.
Denis keeps keys and small tables in memory and writes every change to a journal. Your app speaks to it over a line protocol; your AI assistant speaks to it over MCP.
Free: 3 databases per account, 10 MB and 50,000 keys each, 100,000 commands a day. No card, no tracking.
- 0.3 ms
- key-value p50
- 20k/s
- SQL point reads
- 100 %
- writes survive SIGKILL
- ≤ 1 s
- journal fsync
same as Redis, single client
16 clients, 10k rows; PostgreSQL 17k
9,079 of 9,079 acknowledged
snapshot every 30 s
Measured against Redis 7 and PostgreSQL 16 on the same machine; every number and how to reproduce it.
Measured, not promised.
The same machine, the same client, Redis 7 and PostgreSQL 16 in Docker next to Denis 0.6.1. Point reads, writes by id and COUNT(*) are where in-memory rows with an index per column pay off; ordered range scans and raw throughput at 64 connections are where a C event loop and a real query planner still win. Both sides are on the chart.
Durability and memory
- Denis, SIGKILL
- 9,079 / 9,079
- acknowledged writes recovered from the journal
- Redis, SIGKILL
- 9,968 / 9,968
- AOF, fsync every second
- Denis, graceful restart
- 5,000 / 5,000
- keys back from database.bin
- Memory, 100k × 100 B keys
- 212 MB
- Redis 26 MB · PostgreSQL 47 MB — the JVM heap plus the persisted copy
What a database gives you
- Keys
- Strings, or JSON when you need structure. In memory, journaled to disk when you ask.
- GET · SET · DEL · MGET · KEYS · EXISTS
- Tables
- A small SQL: one table per statement, an index on every column, rows kept in memory.
- CREATE TABLE · INSERT · SELECT with WHERE, ORDER BY, LIMIT · UPDATE · DELETE
- Assistants
- A hosted MCP endpoint per database. Read-only keys expose only the read tools.
- denis_describe · denis_query · denis_execute · denis_get · denis_set
- Console
- Run commands, browse tables and keys, watch storage and daily commands on charts.
- Web console · REST API · JWT for apps
- Your code
- npm install denis-client: the same get/set/query API over HTTPS with an API key, or over TCP against your own server.
- DenisCloud · DenisClient · Java driver
- Your team
- Share a database as admin, editor or viewer; give systems their own username at the database's login page; every command is recorded with who ran it.
- Roles · database accounts · command history
Your data has one door.
The console, the REST API and the MCP endpoint all pass through the same gateway. It checks who you are, what your role allows, whether the key may write, and how much of today's budget is left, then hands the command to the engine. Each database is a separate project inside the engine; nothing else can reach it.
How the service is securedLet an assistant look at it.
Add the endpoint to Claude Desktop, Claude Code or Cursor with an API key. The assistant reads the schema first, then writes and runs the query. Give it a read-only key and it can only read.
{
"mcpServers": {
"denis": {
"url": "https://denis.hacimertgokhan.com/api/mcp",
"headers": { "Authorization": "Bearer dk_your_api_key" }
}
}
}Fast because it is in memory. Safe because it is written down.
A persisted write is acknowledged from memory and appended to a journal in the same moment. A snapshot replaces the journal every thirty seconds. If the process is killed, nothing is lost; if the power goes, at most one second is.
Hosted
Denis Cloud
Sign up, create a database, copy an API key. Console, history, roles, MCP and the REST gateway are ready; quotas keep every tenant in its lane.
import { DenisCloud } from "denis-client";
const denis = new DenisCloud({ apiKey: process.env.DENIS_API_KEY });
await denis.set("user:1", { name: "Ada" }, { persist: true });
await denis.query("SELECT * FROM products WHERE price > 10");Self-hosted
Your own server
One jar or one container, a TCP port, and the same client with the same method names. MIT licensed; the platform you are looking at is open source too.
docker run -p 5142:5142 ghcr.io/hacimertgokhan/denis:0.6.1
# then, in your app
const denis = new DenisClient({ host, port: 5142, group, password, token });Questions people ask first.
- What is Denis?
- An open-source, MIT-licensed database engine written in Java. It keeps keys and small SQL tables in memory, appends every write to a journal and snapshots to disk, and speaks a one-line-per-command protocol over TCP. Denis Cloud hosts it for you.
- Is it a Redis or a PostgreSQL replacement?
- Neither, and both a little. Key-value latency matches Redis at ~0.3 ms; SQL point reads and writes by id are faster than PostgreSQL because rows live in memory with an index per column; range scans and heavy analytics belong in PostgreSQL. It is built for the working set of an application, not for a warehouse.
- How do AI assistants use it?
- Every database has a hosted MCP endpoint. Add it to Claude Desktop, Claude Code or Cursor with an API key and the assistant gets denis_describe, denis_query and friends: it reads the schema, writes the SQL and runs it. A read-only key exposes only the read tools.
- What does the free plan include?
- Three databases per account, each with 10 MB of storage, 50,000 keys and 100,000 commands a day, plus 600 API requests per minute per key. The limits are enforced by the engine and the gateway, never silently.
- Can I run it myself?
- Yes. The engine ships as a jar and a Docker image; the same Node.js package speaks TCP to your own server (DenisClient) or HTTPS to the cloud (DenisCloud) with identical method names. The whole platform is open source too.
- Where is my data and who can see it?
- In the region shown on the database (eu-central), isolated as a separate project inside the engine. Only accounts you share with, database accounts you create and API keys you issue can reach it. The Privacy Policy lists everything the platform stores and for how long; you can export or delete it at any time.
Start with one line.
A database, a key and an MCP endpoint in under a minute. Delete it all with one click when you are done.
- 01Create a databasea name, a region, done
- 02Copy an API keyread-only or read-write
- 03Connectnpm install denis-client, or paste the MCP URL