kevy
Documentation

Documentation

Every chapter, in reading order. Each one is a markdown file in the repository — what you read here and what GitHub shows are the same text.

Getting started

Designing your application on kevy

How to think in keys when you are used to thinking in tables.

The RDS→kevy modeling cookbook

Recipes that run: sessions, rate limits, queues, leaderboards, feeds.

Persistence

The append-only log, snapshots, and what survives a kill -9.

Tuning kevy

Shards, connections, and the two flags that actually matter.

Running it

Upgrading from 6.2 to 6.3

HRANDFIELD, keyspace-event config over the wire, four RESP3 shapes and one GEOPOS reply corrected.

Upgrading from 6.2.0 to 6.2.1

Nothing on the server changes; two client crates finally reach crates.io at the engine's version.

Upgrading from 5.1 to 5.2

Stop 5.1, start 5.2 on the same directory — the Lua dialects now match upstream.

Upgrading from 5.0 to 5.1

Stop 5.0, start 5.1 on the same directory — a read hazard repaired and two stalls removed.

Upgrading from 4.x to 5.0

Stop 4.1.1, start 5.0 on the same directory — and what behaves differently.

Upgrading across the older majors

The older majors: 2.x to 3.x and 3.x to 4.0.

Replication

One primary, N replicas, and the offset that tells you the truth.

Availability

Failover, epochs, and the writes we will not promise to keep.

Cluster

Why there is no cluster, and what to do instead.

Transparent tiering ([tiering] / with_tier_budget*)

A RAM budget for a store bigger than RAM — cold values spill to disk, every command unchanged.

--accept-shards N — fold sparse connections onto a subset of shards

The flag that bought 10.6% by giving fewer cores the listener.

kevy-alloc — the opt-in allocator: what it buys, what it costs

The opt-in allocator: ~10% smaller RSS, priced honestly.

Unix-domain socket (UDS) transport

Unix sockets: no TCP, no loopback, no kernel copy.

Async client

Pipelining, and why the engine has no async runtime.

Working with data

Secondary indexes (IDX.* / idx_*)

Secondary indexes: how they build, and what they cost.

Tables (TABLE.* / table_*)

Declare typed columns and indexes once; query them like a table, at kevy speed.

Migrating hand-maintained indexes to tables

Eight production-paid lessons from replacing hand-maintained indexes.

Vector search (KIND ann)

KNN over your keyspace. No embedding model included.

Full-text search (KIND text)

BM25 full-text, and where it stops.

Views (VIEW.* / view_*)

Materialised views, kept fresh by the write path.

CDC — the change feed (FEED.* / changes_since)

A change feed you can tail from another process.

Pub/sub

Channels, patterns, and what happens to a slow subscriber.

Lua scripting

EVAL, on an interpreter we wrote.

packed-rows — store a declared row as one allocation

One allocation per declared row, and the ordering that decides whether it saves anything.

Embedding it

kevy on WebAssembly

151 KB in a browser tab, persisted to OPFS.

Embedded read-only RESP listener

Embed the engine and still speak RESP on a socket.

kevy on IoT devices

no_std, no allocator, no operating system.

Clients

Reference

What kevy will not do

What kevy refuses, why, and what to use instead — read before you build on a guess.

Error reply catalog

Every error string, and the contract it is part of.

RDS workloads on kevy

What a relational workload costs here, honestly.

Migration — the playbook and the toolchain

Moving in from Redis, and back out again.

Command reference

Command reference

Every verb the engine answers, generated from the table it dispatches on.