A pure-Rust, zero-dependency, Redis-compatible serving engine.
One engine, three forms: a standalone server, an
in-process Rust library, and a WebAssembly module for the browser.
Every form speaks RESP2 — redis-cli and every Redis
client library work unchanged.
# server cargo install kevy # container docker run --rm -p 6379:6379 goliakk/kevy:latest # browser npm i @goliajp/kevy
Measured, not claimed.
| server | configuration | GET ops/s | SET ops/s | relative (GET) |
|---|---|---|---|---|
| kevy 3.18.0 | --threads 8, io_uring | 6,389,776 ±2.8k | 6,384,676 ±582k | |
| redis 8 (8.4.x) | --io-threads 8 | 3,996,004 ±198k | 2,460,024 ±112k | |
| valkey 9.1 | --io-threads 8 | 2,132,196 ±68k | 1,598,402 ±0.1k | |
| dragonfly (2025-06) | --proactor_threads=8 | 1,776,199 ±42k | 1,453,224 ±28k |
Protocol: redis-benchmark -c 50 -P 16 -n 8M -t get,set,
median of 5 runs ± sample stdev. One box (i7-10700K, 8C16T, Linux 6.12),
fair-fight pinning: server on cores 0–7, benchmark client on cores 8–15;
every server measured with the same client, same protocol, same box.
Reproduce with bench/arena.sh;
full decomposition in
bench/PERF-DECOMP-V4-T9.md.
Redis parity below, a serving engine above.
IDX.*).(generation, offset) positions and exact recovery points — the built-in outbox.FAILOVER), quorum crash elections.WAIT, read-your-writes tokens, bounded staleness, quorum-fenced writes.kevy-mcp: stdio JSON-RPC for AI agents, schema generated from the same verb contract as COMMAND DOCS.@goliajp/kevy): OPFS/IndexedDB persistence, cross-tab pub/sub, zero dependencies.kevy-embedded down to a minimal KV+TTL core; musl/ARM cross-build and size/RSS budget gates in CI.Run kevy in this browser, right now.
The demo loads the real engine as a ~420 KB wasm module: a command-line REPL over the browser API, persistence to OPFS (IndexedDB fallback) that survives a reload, and pub/sub across tabs. Nothing leaves your machine — there is no backend.