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.

$npm install denis-client

Free: 3 databases per account, 10 MB and 50,000 keys each, 100,000 commands a day. No card, no tracking.

denis cli shell -g shopMODE json
>
0.3 ms
key-value p50

same as Redis, single client

20k/s
SQL point reads

16 clients, 10k rows; PostgreSQL 17k

100 %
writes survive SIGKILL

9,079 of 9,079 acknowledged

≤ 1 s
journal fsync

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.

Full results and how to reproduce them

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
SQL point read by id
10k rows, 16 clients
1.2× Denis
Denis20.0kPostgreSQL16.9k
SQL update by id
16 clients
4.2× Denis
Denis16.8kPostgreSQL3,990
SQL delete by id
16 clients
6.6× Denis
Denis26.6kPostgreSQL4,026
COUNT(*) on 50k rows
single client · O(1) in Denis
4.1× Denis
Denis3,159PostgreSQL771
Range scan + ORDER BY + LIMIT 20
single client · no ordered index yet
3.1× PostgreSQL
Denis398PostgreSQL1,216
SET, persisted
single client
1.0× Redis
Denis3,310Redis3,412
SET, persisted
64 clients · thread per connection vs event loop
1.9× Redis
Denis61.8kRedis115.6k
MGET 10 keys
16 clients · Denis at ~80 % of Redis
1.3× Redis
Denis80 %Redis100 %

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 secured
Denis Cloud architecture: three clients go through one gateway to isolated projects in the Denis engineWeb consoleyou, signed inYour applicationAPI key or JWTAI assistantMCP over HTTPGatewayownership checkread / write scopedaily command budgetrate limitmetering & chartssessionREST /api/v1/exec/api/mcpDenis engineone process, main token held by the platformproject tokenproject Akeys · tables · quotaproject Bkeys · tables · quotaproject Ckeys · tables · quotaevery project is its own namespace; nobody else can reach it

Let 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.

MCP configuration
{
  "mcpServers": {
    "denis": {
      "url": "https://denis.hacimertgokhan.com/api/mcp",
      "headers": { "Authorization": "Bearer dk_your_api_key" }
    }
  }
}
MCP flow: the assistant reads the schema with denis_describe, runs SQL with denis_query and answersYou ask“which products cost > 10?”denis_describetables, columns, keysdenis_querySELECT … WHERE price > 10Answerrows, as a tableread-only keys expose only the read tools; writes need a write-scoped 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.

Write path: memory, then the append-only journal, then periodic snapshotsSET key value -&saveacknowledged in memorydatabase.journalappended at once, fsync every 1 severy 30 sdatabase.binatomic snapshotrestartRecoveredsnapshot + replaya killed process loses nothing; a power loss loses at most one second

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.

typescript
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.

bash
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.

  1. 01Create a databasea name, a region, done
  2. 02Copy an API keyread-only or read-write
  3. 03Connectnpm install denis-client, or paste the MCP URL